| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526 | <?php/** * * PHP Pro Bid $Id$ Nz3Tz2sMs25Q1mXlp28//dTe1bcmWSgKR2rKzMPhtCI= * * @link        http://www.phpprobid.com * @copyright   Copyright (c) 2016 Online Ventures Software & CodeCube SRL * @license     http://www.phpprobid.com/license Commercial License * * @version     7.7 *//** * users table service class */namespace Ppb\Service;use Ppb\Db\Table\Users as UsersTable,    Ppb\Service,    Ppb\Model\Shipping as ShippingModel,    Ppb\Db\Table\Row\User as UserModel,    Cube\Db\Expr;class Users extends AbstractService{    /**     * admin user roles     */    const ADMIN_ROLE_PRIMARY = 'Admin';    const ADMIN_ROLE_MANAGER = 'Manager';    protected static $_adminRoles = array(        self::ADMIN_ROLE_PRIMARY => 'Administrator',        self::ADMIN_ROLE_MANAGER => 'Manager',    );    /**     * custom fields tables "type" column     */    const CUSTOM_FIELDS_TYPE = 'user';    /**     *     * custom fields data table service     *     * @var \Ppb\Service\CustomFieldsData     */    protected $_customFieldsData;    /**     *     * payment gateways service     *     * @var \Ppb\Service\Table\PaymentGateways     */    protected $_paymentGateways;    /**     *     * users address book table service     *     * @var \Ppb\Service\UsersAddressBook     */    protected $_usersAddressBook;    /**     *     * user subscriptions that are used when:     * - disabling expired subscriptions,     * - re-billing automatically in account mode     * - notifying users by email that subscriptions are about to expire     *     * @var array     */    protected $_subscriptionTypes = array(        'UserVerification'  => array(            'name'           => 'User Verification Subscription',            'active'         => 'user_verified',            'expirationDate' => 'user_verified_next_payment',            'emailFlag'      => 'user_verified_email',            'updateMethod'   => 'updateUserVerification',            'feesService'    => '\Ppb\Service\Fees\UserVerification',            'renewalLink'    => array('module' => 'app', 'controller' => 'payment', 'action' => 'user-verification'),            'managementLink' => array('module' => 'members', 'controller' => 'user', 'action' => 'verification'),        ),        'StoreSubscription' => array(            'name'           => 'Store Subscription',            'active'         => 'store_active',            'expirationDate' => 'store_next_payment',            'emailFlag'      => 'store_expiration_email',            'updateMethod'   => 'updateStoreSubscription',            'feesService'    => '\Ppb\Service\Fees\StoreSubscription',            'renewalLink'    => array('module' => 'app', 'controller' => 'payment', 'action' => 'store-subscription'),            'managementLink' => array('module' => 'members', 'controller' => 'store', 'action' => 'setup'),        ),    );    /**     *     * class constructor     */    public function __construct()    {        parent::__construct();        $this->setTable(            new UsersTable());    }    /**     *     * set custom fields data service     *     * @param \Ppb\Service\CustomFieldsData $customFieldsData     *     * @return \Ppb\Service\Users     */    public function setCustomFieldsDataService(Service\CustomFieldsData $customFieldsData)    {        $this->_customFieldsData = $customFieldsData;        return $this;    }    /**     *     * get custom fields data service     *     * @return \Ppb\Service\CustomFieldsData     */    public function getCustomFieldsDataService()    {        if (!$this->_customFieldsData instanceof Service\CustomFieldsData) {            $this->setCustomFieldsDataService(                new Service\CustomFieldsData());        }        return $this->_customFieldsData;    }    /**     *     * set payment gateways service     *     * @param \Ppb\Service\Table\PaymentGateways $paymentGateways     *     * @return \Ppb\Service\Users     */    public function setPaymentGateways(Service\Table\PaymentGateways $paymentGateways)    {        $this->_paymentGateways = $paymentGateways;        return $this;    }    /**     *     * get payment gateways service     *     * @return \Ppb\Service\Table\PaymentGateways     */    public function getPaymentGateways()    {        if (!$this->_paymentGateways instanceof Service\Table\PaymentGateways) {            $this->setPaymentGateways(                new Service\Table\PaymentGateways());        }        return $this->_paymentGateways;    }    /**     *     * set users address book service     *     * @param \Ppb\Service\UsersAddressBook $addressBook     *     * @return \Ppb\Service\Users     */    public function setUsersAddressBook(Service\UsersAddressBook $addressBook)    {        $this->_usersAddressBook = $addressBook;        return $this;    }    /**     *     * get users address book service     *     * @return \Ppb\Service\UsersAddressBook     */    public function getUsersAddressBook()    {        if (!$this->_usersAddressBook instanceof Service\UsersAddressBook) {            $this->setUsersAddressBook(                new Service\UsersAddressBook());        }        return $this->_usersAddressBook;    }    /**     *     * set subscription types array     *     * @param array $subscriptionTypes     *     * @return $this     */    public function setSubscriptionTypes($subscriptionTypes)    {        $this->_subscriptionTypes = $subscriptionTypes;        return $this;    }    /**     *     * get subscription types array     *     * @return array     */    public function getSubscriptionTypes()    {        return $this->_subscriptionTypes;    }    /**     *     * set admin roles     *     * @param $adminRoles     */    public static function setAdminRoles($adminRoles)    {        self::$_adminRoles = $adminRoles;    }    /**     *     * get admin roles     *     * @return array     */    public static function getAdminRoles()    {        return self::$_adminRoles;    }    /**     *     * find a row on the table by querying a certain column     * also get the primary address from the UsersAddressBook table     *     * @param string $name     column name     * @param string $value    column value     * @param bool   $enhanced if set to true, it will retrieve all additional related data as an array (including the primary address)     *     * @return \Ppb\Db\Table\Row\User     */    public function findBy($name, $value, $enhanced = false)    {        /** @var \Ppb\Db\Table\Row\User $user */        $user = parent::findBy($name, $value);        if (count($user) > 0) {            $user->setAddress();            if ($enhanced === true) {                // custom fields data                $customFieldsData = $this->getCustomFieldsData($user['id']);                foreach ($customFieldsData as $key => $value) {                    $user['custom_field_' . $key] = $value;                }            }        }        return $user;    }    /**     *     * save users data in the users table     * also create the postage settings default array (type = item and shipping locations = domestic)     *     * @param array $post     * @param int   $userId used for when editing a user     *     * @return int              the id of the user that was saved     */    public function save($post, $userId = null)    {        $user = null;        $data = $this->_prepareSaveData($post);        if ($userId !== null) {            $user = $this->findBy('id', $userId);        }        else if (array_key_exists('username', $post)) {            $user = $this->findBy('username', $post['username']);        }        if (isset($post['name'])) {            $post['first_name'] = (!empty($post['name']['first'])) ? $post['name']['first'] : '';            $post['last_name'] = (!empty($post['name']['last'])) ? $post['name']['last'] : '';        }        if (count($user) > 0) {            $data['updated_at'] = new Expr('now()');            unset($data['username']);            $this->_table->update($data, "id='{$user['id']}'");            $id = $user['id'];        }        else {            $data['created_at'] = new Expr('now()');            if (!isset($data['postage_settings'])) {                $data['postage_settings'] = serialize(array(                    ShippingModel::SETUP_SHIPPING_LOCATIONS => ShippingModel::POSTAGE_LOCATION_DOMESTIC,                    ShippingModel::SETUP_POSTAGE_TYPE       => ShippingModel::POSTAGE_TYPE_ITEM,                    ShippingModel::SETUP_FREE_POSTAGE       => 0,                ));            }            $settings = $this->getSettings();            $data['balance'] = (-1) * $settings['signup_credit'];            $data['max_debit'] = doubleval($settings['maximum_debit']);            $data['account_mode'] = $settings['payment_mode'];            $this->_table->insert($data);            $id = $this->_table->getAdapter()->lastInsertId();            $user = $this->findBy('id', $id);        }        if (!empty($post['password'])) {            $this->savePassword($user, $post['password']);        }        if (!isset($post['partial'])) {            // save custom fields data in the database            foreach ($post as $key => $value) {                if (strstr($key, 'custom_field_')) {                    $fieldId = str_replace('custom_field_', '', $key);                    $this->getCustomFieldsDataService()->save(                        $value, self::CUSTOM_FIELDS_TYPE, $fieldId, $id);                }            }            // save payment gateways data in the database            $gatewayFields = $this->getPaymentGateways()->getDirectPaymentFields();            foreach ($gatewayFields as $key => $gatewayField) {                $gatewayFields[$key]['user_id'] = $id;                if (array_key_exists($gatewayField['name'], $post)) {                    $gatewayFields[$key]['value'] = $post[$gatewayField['name']];                }            }            foreach ((array)$gatewayFields as $gatewayField) {                $this->getPaymentGateways()->getPaymentGatewaysSettings()->save($gatewayField);            }            // save the user's address in the address book (but only if the address form - at least one field from it - is present)            if (array_intersect($this->getUsersAddressBook()->getAddressFields(), array_keys($post))) {                $this->getUsersAddressBook()->save($post, $id);            }        }        return $id;    }    /**     *     * hash a password     *     * @param string $password     * @param string $salt     *     * @return string   hashed password     */    public function hashPassword($password, $salt)    {        return hash('sha256', $password . $salt);    }    /**     *     * save a password for a certain user in the users table     *     * @param \Ppb\Db\Table\Row\User $user     * @param string                 $password the raw password     *     * @return $this     */    public function savePassword(UserModel $user, $password)    {        $salt = date('U', time());        $password = $this->hashPassword($password, $salt);        $user->save(array(            'password' => $password,            'salt'     => $salt,        ));        return $this;    }    /**     *     * delete a user from the table     *     * @param integer $userId the id of the user     *     * @return integer      the number of affected rows     */    public function delete($userId)    {        $where = $this->_table->getAdapter()->quoteInto('id = ?', $userId);        return $this->_table->delete($where);    }    /**     *     * generate a unique registration key used for verifying the user's email address     *     * @param integer $id     * @param string  $username     *     * @return string     */    public function generateRegistrationKey($id, $username)    {        $hash = md5(uniqid(time()));        return substr(            hash('sha256', $id . $username . $hash), 0, 10);    }    /**     *     * verify an email address and return true if successful, false otherwise     *     * @param string $key the key used to verify the account     *     * @return bool     */    public function verifyEmailAddress($key)    {        return (bool)$this->_table->update(array('mail_activated' => 1), "registration_key='{$key}'");    }    /**     *     * unsubscribe user from newsletter     *     * @param string $username     * @param string $email     *     * @return bool     */    public function newsletterUnsubscribe($username, $email)    {        return (bool)$this->_table->update(array('newsletter_subscription' => 0), "username='{$username}' AND email='{$email}'");    }    /**     *     * get the custom fields data of a certain user     *     * @param integer $id     *     * @return array     */    public function getCustomFieldsData($id)    {        $result = array();        // custom fields data        $rowset = $this->getCustomFieldsDataService()->fetchAll(            $this->getCustomFieldsDataService()->getTable()->select('value, field_id')                ->where('type = ?', self::CUSTOM_FIELDS_TYPE)                ->where('owner_id = ?', (int)$id));        foreach ($rowset as $row) {            $result[$row['field_id']] = \Ppb\Utility::unserialize($row['value']);        }        return $result;    }    /**     *     * prepare user data for when saving to the table     *     * @param array $data     *     * @return array     */    protected function _prepareSaveData($data = array())    {        if (isset($data['id'])) {            unset($data['id']);        }        if (isset($data['password'])) {            unset($data['password']);        }        if (isset($data['salt'])) {            unset($data['salt']);        }        return parent::_prepareSaveData($data);    }}
 |