Current File : /home/pacjaorg/public_html/km/components/com_djclassifieds/models/profiles.php |
<?php
/**
* @package DJ-Classifieds
* @copyright Copyright (C) DJ-Extensions.com, All rights reserved.
* @license http://www.gnu.org/licenses GNU/GPL
* @author url: http://dj-extensions.com
* @author email contact@dj-extensions.com
*/
defined ('_JEXEC') or die('Restricted access');
class DjclassifiedsModelProfiles extends DJClassifiedsModel
{
private static $_items_query = '';
function getItems()
{
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$par = $app->getParams('com_djclassifieds');
$user = JFactory::getUser();
$ug_restriction = $par->get('ug_restriction');
$limit = $app->input->getInt('limit', $par->get('profiles_limit','6'));
$limitstart = $app->input->getInt('limitstart', 0);
$select = "";
$join = "";
$where = "";
$having = "";
if($app->input->get('se')){
$p = $app->input->get('se') == 'p' ? '' : 'p_'; // backward compatibility
if($app->input->getVar($p.'search')){
$where .= "AND CONCAT_WS(' ',".($par->get('authorname','name')=='name' ? 'u.name' : 'u.username').",IFNULL(p.address,''),IFNULL(r.name,''),IFNULL(ws.vals,'')) LIKE ".$db->q('%'.$db->escape($app->input->getVar($p.'search'), true).'%')." ";
}
$reg_id = DJClassifiedsTheme::getIdFromTree($app->input->getVar($p.'se_regs'));
if($reg_id){
$regs = DJClassifiedsRegion::getSubReg($reg_id,1);
$reglist = $reg_id;
foreach($regs as $r){
$reglist .= ','. $r->id;
}
$where .= 'AND p.region_id IN ('.$reglist.') ';
}else{
$reglist = DJClassifiedsRegion::getDefaultRegionsIds();
if($reglist){
$where .= 'AND p.region_id IN ('.$reglist.') ';
}
}
$radius = $app->input->getFloat($p.'se_radius',0);
$se_postcode = $app->input->getVar($p.'se_postcode','');
$se_postcode_country = $app->input->getVar($p.'se_postcode_c','');
$se_address = $app->input->getVar($p.'se_address','');
$se_geoloc = $app->input->getVar($p.'se_geoloc','');
if($radius > 0){
$radius_unit = $app->input->getCmd($p.'se_radius_unit','km');
$radius_unit_v = $radius_unit=='mile' ? 3959 : 6371;
$coord_arr = array();
if($se_geoloc){
if(isset($_COOKIE["djcf_latlon"])){
$user_latlog = explode('_', $_COOKIE["djcf_latlon"]);
$coord_arr = array('lat' => $user_latlog[0], 'lng' => $user_latlog[1]);
}
}else if($se_postcode){
$coord_arr = DJClassifiedsGeocode::getLocationPostCode($se_postcode, $se_postcode_country);
}else if($se_address){
$coord_arr = DJClassifiedsGeocode::getLocation($se_address);
}
if($coord_arr){
$select .= ', ( '.$radius_unit_v.' * acos( cos( radians('.$coord_arr['lat'].') ) * cos( radians( p.latitude ) ) * cos( radians( p.longitude ) - radians('.$coord_arr['lng'].') ) + sin( radians('.$coord_arr['lat'].') ) * sin( radians( p.latitude ) ) ) ) AS distance ';
$having .= "distance < ".$radius." ";
}elseif($se_postcode || $se_address){
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_SORRY_WE_CANT_FIND_COORDINATES_FROM_ADDRESS_WE_OMIITED_RANGE_RESTRICTION'), 'notice');
}
}
$join .= $this->getSearchFieldsQuery('profile');
if($app->input->getInt($p.'se_account_type', 0)){
$where .= "AND p.group_id=".$app->input->getInt($p.'se_account_type', 0)." ";
}
}else{
$reglist = DJClassifiedsRegion::getDefaultRegionsIds();
if($reglist){
$where .= 'AND p.region_id IN ('.$reglist.') ';
}
}
if($par->get('profiles_with_items_only','0')){
$join .= "INNER JOIN (SELECT user_id, count(*) FROM #__djcf_items WHERE user_id!=0 GROUP BY user_id) uc ON u.id=uc.user_id ";
}
if($par->get('fav_profiles','0') && $user->id){
$select = ", f.id as f_id ";
$join .= "LEFT JOIN #__djcf_profiles_fav f ON u.id=f.profile_id AND f.user_id=".$user->id." ";
if($par->get('show_fav_profiles','0')){
$where .= "AND f.id IS NOT NULL ";
}
}
if($par->get('group_id')){
$where .= "AND p.group_id=".$par->get('group_id')." ";
}
$order = $app->input->getCmd('order', $par->get('profiles_ordering','lastvisitDate'));
$ord_t = $app->input->getCmd('ord_t', $par->get('profiles_ordering_dir','desc'));
$sort_fields = DJClassifiedsField::getProfileSortFields();
$ord = "u.lastvisitDate ";
if($order=="name"){
$ord = "u.name ";
}else if($order=="username"){
$ord = "u.username ";
}else if($order=="loc"){
$ord = "r.name ";
}else if($order=="random"){
$rand_val = $app->getUserState('djclassifieds.profiles.rand_val', '');
if(!$limitstart || !$rand_val){
$rand_val = mt_rand();
$app->setUserState('djclassifieds.profiles.rand_val', $rand_val);
}
$ord = "RAND(".$rand_val.") ";
}elseif(!empty($sort_fields[$order])){ // sortable custom fields
$ord = "IFNULL(`".$order."`.value,'') ";
$join .= "LEFT JOIN (SELECT IFNULL((CASE WHEN f.type='date' THEN fv.value_date WHEN f.type='date_from_to' THEN CONCAT(fv.value_date,' - ',fv.value_date_to) ELSE fv.value END),'') value, fv.user_id FROM #__djcf_fields f INNER JOIN #__djcf_fields_values_profile fv ON f.id=fv.field_id AND f.id='".$sort_fields[$order]->id."') `".$sort_fields[$order]->name."` ON u.id=`".$sort_fields[$order]->name."`.user_id ";
}
$ord .= $ord_t == 'asc' ? 'ASC' : 'DESC';
$query = "SELECT u.id as u_id, u.name, u.username, u.email, u.".$par->get('authorname','name')." as authorname, p.*, img.path, img.path img_path, r.id r_id, r.name as r_name, r.alias as r_alias "
.$select
."FROM #__users u "
."LEFT JOIN #__djcf_profiles p ON u.id=p.user_id "
."LEFT JOIN (SELECT item_id, CONCAT(path,name,'_th','.',ext) path FROM #__djcf_images WHERE type='profile') img ON p.user_id=img.item_id "
."LEFT JOIN #__djcf_regions r ON p.region_id=r.id "
.$join
.($ug_restriction ? "INNER JOIN (SELECT DISTINCT user_id FROM #__user_usergroup_map WHERE group_id IN (".implode(',',$ug_restriction).")) v ON v.user_id=u.id " : "")
."WHERE u.block=0 AND (u.activation = '0' OR u.activation = '') "
.$where
.($having ? "HAVING ".$having." " : "")
."ORDER BY ".$ord;
$app->triggerEvent('onDJClassifiedsProfilesListingQuery', array(&$query, &$limitstart, &$limit, 'profiles', &$par));
self::$_items_query = $query;
$items = $this->_getList($query, $limitstart, $limit);
$profile_fields = $this->getProfileFields(implode(',', array_map(function($v){return $v->u_id;}, $items)), $par);
foreach($items as $key => $item){
$item->profile_fields = array();
foreach($profile_fields as $pf){
if($item->u_id==$pf->user_id){
$item->profile_fields[$pf->id] = $pf;
}
}
$items[$key]->profile_uri = DJClassifiedsSEO::getViewUri('profile', array('group_id' => $item->group_id)).'&uid='.DJClassifiedsSEO::getUserSlug($item->u_id, $item->authorname);
}
return $items;
}
function getCountItems()
{
$db = JFactory::getDBO();
$query = "SELECT count(u_id) FROM (".self::$_items_query.") as q";
$db->setQuery($query);
$items_count = $db->loadResult();
return $items_count;
}
function getProfileFields($uid_list, $par)
{
$db = JFactory::getDBO();
$user = JFactory::getUser();
$ug = implode(',', $user->getAuthorisedViewLevels());
$query = $db->getQuery(true);
$query->select(array('fv.*', 'f.*'))
->from('#__djcf_fields f')
->join('INNER', '#__djcf_fields_values_profile fv ON f.id = fv.field_id')
->where('f.source = 2')
->where('f.published = 1')
->where('f.access IN ('.$ug.')')
->where('f.in_blog = 1')
->order('f.ordering, f.label');
if($uid_list){
$query->where('fv.user_id IN ('.$uid_list.')');
}
$db->setQuery($query);
$fields = $db->loadObjectList();
DJClassifiedsAccess::filterFieldsByGroupAccess($fields);
DJClassifiedsField::convertFieldsValues($fields, $par);
return $fields;
}
}