ImpressCMS/impresscms

View on GitHub
htdocs/modules/system/admin/rating/class/rating.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
/**
 * ImpressCMS Ratings
 *
 * @copyright    The ImpressCMS Project http://www.impresscms.org/
 * @license        http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU General Public License (GPL)
 * @package        System
 * @subpackage    Ratings
 * @since        1.2
 * @author        Sina Asghari (aka stranger) <pesian_stranger@users.sourceforge.net>
 * @version        SVN: $Id: rating.php 11282 2011-06-23 14:44:34Z phoenyx $
 */

/**
 * Rating object
 * @package        System
 * @subpackage    Ratings
 */
class SystemRating extends icms_ipf_Object {

    /** */
    public $_modulePlugin = FALSE;

    /**
     * Constructor for the ratings object
     * @param object $handler
     */
    public function __construct(&$handler) {
        parent::__construct($handler);

        $this->quickInitVar('ratingid', XOBJ_DTYPE_INT, TRUE);
        $this->quickInitVar('dirname', XOBJ_DTYPE_TXTBOX, TRUE, _CO_ICMS_RATING_DIRNAME);
        $this->quickInitVar('item', XOBJ_DTYPE_TXTBOX, TRUE, _CO_ICMS_RATING_ITEM);
        $this->quickInitVar('itemid', XOBJ_DTYPE_INT, TRUE, _CO_ICMS_RATING_ITEMID);
        $this->quickInitVar('uid', XOBJ_DTYPE_INT, TRUE, _CO_ICMS_RATING_UID);
        $this->quickInitVar('date', XOBJ_DTYPE_LTIME, TRUE, _CO_ICMS_RATING_DATE);
        $this->quickInitVar('rate', XOBJ_DTYPE_INT, TRUE, _CO_ICMS_RATING_RATE);

        $this->initNonPersistableVar('name', XOBJ_DTYPE_TXTBOX, 'user', _CO_ICMS_RATING_NAME);
        $this->setControl('dirname', array('method' => 'getModuleList', 'onSelect' => 'submit'));
        $this->setControl('item', array('object' => &$this, 'method' => 'getItemList'));
        $this->setControl('uid', 'user');
        $this->setControl('rate', array('method' => 'getRateList'));
    }

    /**
     * Custom accessors for properties
     * 
     * @param    string $key
     * @param    string $format
     * @return    mixed
     */
    public function getVar($key, $format = 's') {
        if ($format == 's' && in_array($key, array())) {
            return call_user_func(array($this, $key));
        }
        return parent::getVar($key, $format);
    }

    /**
     * Retrieve the username associated with a rating 
     * @return    string
     */
    public function name() {
        return icms_member_user_Handler::getUserLink($this->getVar('uid', 'e'), TRUE, array());
    }

    /**
     * Accessor for the dirname property
     * @return    string
     */
    public function dirname() {
        $moduleArray = $this->handler->getModuleList();
        return $moduleArray[$this->getVar('dirname', 'n')];
    }

    /**
     * Enter description here ...
     * @return
     */
    public function getItemList() {
        $plugin = $this->getModulePlugin();
        return $plugin->getItemList();
    }

    /**
     * Retrieve the value of the rating as a link
     * @return    string
     */
    public function getItemValue() {
        $moduleUrl = ICMS_MODULES_URL . '/' . $this->getVar('dirname', 'n') . '/';
        $plugin = $this->getModulePlugin();
        $pluginItemInfo = $plugin->getItemInfo($this->getVar('item'));
        if (!$pluginItemInfo) {
            return '';
        }
        $itemPath = sprintf($pluginItemInfo['url'], $this->getVar('itemid'));
        $ret = '<a href="' . $moduleUrl . $itemPath . '">' . $pluginItemInfo['caption'] . '</a>';
        return $ret;
    }

    /**
     * Accessor for the rate property
     * @return    int
     */
    public function getRateValue() {
        return $this->getVar('rate');
    }
    
    /**
     * Create a link to the user profile associated with the rating
     * 
     * @return    string
     * @see    icms_member_user_Handler::getUserLink
     */
    public function getUnameValue() {
        return icms_member_user_Handler::getUserLink($this->getVar('uid'));
    }

    /**
     * Enter description here ...
     */
    public function getModulePlugin() {
        if (!$this->_modulePlugin) {
            $this->_modulePlugin = $this->handler->pluginsObject->getPlugin('rating', $this->getVar('dirname', 'n'));
        }
        return $this->_modulePlugin;
    }
}

/**
 * Handler for the ratings object
 * @package        System
 * @subpackage    Ratings
 */
class SystemRatingHandler extends icms_ipf_Handler {

    public $_rateOptions = array();
    public $_moduleList = FALSE;
    public $pluginsObject;

    /**
     * Constructor for the ratings handler
     * 
     * @param object $db
     */
    public function __construct($db) {
        parent::__construct($db, 'rating', 'ratingid', 'rate', '', 'system');
        $this->generalSQL = 'SELECT * FROM ' . $this->table . ' AS ' . $this->_itemname . ' INNER JOIN ' . $this->db->prefix('users') . ' AS user ON ' . $this->_itemname . '.uid=user.uid';

        $this->_rateOptions[1] = 1;
        $this->_rateOptions[2] = 2;
        $this->_rateOptions[3] = 3;
        $this->_rateOptions[4] = 4;
        $this->_rateOptions[5] = 5;

        $this->pluginsObject = new icms_plugins_Handler();
    }

    /**
     * Retrieve a list of modules enabling ratings
     * @return    array
     */
    public function getModuleList() {
        if (!$this->_moduleList) {
            $moduleArray = $this->pluginsObject->getPluginsArray('rating');
            $this->_moduleList[0] = _CO_ICMS_MAKE_SELECTION;
            foreach ($moduleArray as $k=>$v) {
                $this->_moduleList[$k] = $v;
            }
        }
        return $this->_moduleList;
    }

    /**
     * Accessor for the rate property
     * @return    array    Rating options
     */
    public function getRateList() {
        return $this->_rateOptions;
    }

    /**
     * Get the average rating for an item
     * 
     * @param int $itemid
     * @param str $dirname
     * @param str $item
     * @return    int|array    0 if there is no rating; an array containing the average and the total ratings for the item
     */
    public function getRatingAverageByItemId($itemid, $dirname, $item) {
        $itemid = (int) $itemid;
        $sql = "SELECT AVG(rate), COUNT(ratingid) FROM " . $this->table . " WHERE itemid=$itemid AND dirname='$dirname' AND item='$item' GROUP BY itemid";
        $result = $this->db->query($sql);
        if (!$result) {
            return 0;
        }
        list($average, $sum) = $this->db->fetchRow($result);
        $ret['average'] = isset($average) ? $average : 0;
        $ret['sum'] = isset($sum) ? $sum : 0;
        return $ret;
    }
    
    /**
     * Determine if a user has already rated an item
     * 
     * @param    str    $item
     * @param    int    $itemid
     * @param    str    $dirname
     * @param    int    $uid
     * @return    bool|array
     */
    public function already_rated($item, $itemid, $dirname, $uid) {

        $criteria = new icms_db_criteria_Compo();
        $criteria->add(new icms_db_criteria_Item('item', $item));
        $criteria->add(new icms_db_criteria_Item('itemid', (int) $itemid));
        $criteria->add(new icms_db_criteria_Item('dirname', $dirname));
        $criteria->add(new icms_db_criteria_Item('user.uid', (int) $uid));

        $ret = $this->getObjects($criteria);

        if (!$ret) {
            return FALSE;
        } else {
            return $ret[0];
        }
    }
}