Current File : /home/pacjaorg/public_html/km/components/com_djclassifieds/models/items.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 DjclassifiedsModelItems extends DJClassifiedsModel
{	
	public static $_items_query = '';
	
	function getItems($catlist = '')
	{
		$app = JFactory::getApplication();
		$db	= JFactory::getDBO();
		$user = JFactory::getUser();
		$par = $app->getParams('com_djclassifieds');
		$date_now = JFactory::getDate()->toSQL();

		if($app->input->getVar('format','')=='feed'){
			$limitstart = 0;
			$limit = 100;
		}else{
			$limitstart	= $app->input->getInt('limitstart', 0);
			$limit = $app->input->getInt('limit', $par->get('limit_djitem_show','7'));
		}

		$select = "";
		$join = "";
		$where = "";
		$having = "";

		if($catlist){
			if(JPluginHelper::isEnabled('djclassifieds', 'multicategories')){
				$where .= "AND (i.cat_id IN (".$catlist.") OR mc.mcat_c>0) ";
				$join = "LEFT JOIN (SELECT item_id, count(id) as mcat_c FROM #__djcf_items_categories WHERE cat_id IN (".$catlist.") GROUP BY item_id) mc ON i.id=mc.item_id ";
			}else{
				$where .= "AND i.cat_id IN (".$catlist.") ";
			}
		}
		
		if($app->input->getInt('uid', 0)){
			$where .= "AND i.user_id=".$app->input->getInt('uid')." ";
		}

		if($user->id && ($par->get('favourite','1') || ($app->input->getInt('fav',0) && $par->get('show_fav_items','1')))){
			$select = ", f.id as f_id ";
			$join .= "LEFT JOIN #__djcf_favourites f ON i.id=f.item_id AND f.user_id=".$user->id." ";
			if($app->input->getInt('fav',0) && $par->get('show_fav_items','1')){
				$where .= "AND f.id IS NOT NULL ";
			}
		}

		if($user->id && $par->get('show_fav_profiles_items','0')){
			$join .= "INNER JOIN #__djcf_profiles_fav fp ON i.user_id=fp.profile_id AND fp.user_id=".$user->id." ";
		}

		if($par->get('type_id',array())){
			$where .= "AND i.type_id IN (".implode(',', $par->get('type_id')).") ";
		}

		if($app->input->getInt('se', 0)){
			if($app->input->getVar('search')){
				if($par->get('search_type_phrase',0)==1){
					$se_words = explode(' ',$db->escape($app->input->getVar('search'), true));
					foreach($se_words as $se_w){
						$se_w = trim($se_w);
						$se_w = trim($se_w, ',.;');
						if(mb_strlen($se_w) > 2){
							$where .= "AND (".DJClassifiedsTheme::getSearchPhraseQueryFilter($se_w, $par).") ";
						}
					}
				}else{
					$where .= "AND (".DJClassifiedsTheme::getSearchPhraseQueryFilter($app->input->getVar('search'), $par).") ";
				}
			}

			$se_cat_id = DJClassifiedsTheme::getIdFromTree($app->input->getVar('se_cats'));
									
			if($se_cat_id){
				$cats = DJClassifiedsCategory::getSubCat($se_cat_id,1);
				$se_catlist = $se_cat_id;
				foreach($cats as $c){
					$se_catlist .= ','. $c->id;
				}
				if(JPluginHelper::isEnabled('djclassifieds', 'multicategories')){
					$where .= ' AND (i.cat_id IN ('.$se_catlist.') OR se_mc.mcat_c>0) ';		
					$join .= "LEFT JOIN (SELECT item_id, count(id) as mcat_c FROM #__djcf_items_categories WHERE cat_id IN (".$se_catlist.") GROUP BY item_id) se_mc ON i.id=se_mc.item_id ";
				}else{
					$where .= ' AND i.cat_id IN ('.$se_catlist.') ';
				}
			}
			
			$join .= $this->getSearchFieldsQuery('item', $se_cat_id);

			$reg_id = DJClassifiedsTheme::getIdFromTree($app->input->getVar('se_regs'));
			if($reg_id){
				$regs = DJClassifiedsRegion::getSubReg($reg_id,1);
				
				$reglist = $reg_id;			
				foreach($regs as $r){
					$reglist .= ','. $r->id;
				}
				$reg_search = ' AND i.region_id IN ('.$reglist.') ';						
			}else{
				$reglist = DJClassifiedsRegion::getDefaultRegionsIds();
				if($reglist){
					$reg_search = ' AND i.region_id IN ('.$reglist.') ';
				}
			}
			$app->triggerEvent('onPrepareDJClassifiedsListingQueryRegSearch', array(&$reg_search, $reglist));
			$where .= $reg_search;
			
			if($par->get('price_strip_onsearch', '0') && $par->get('price_strip_onsearch_chars')){
				$where .= DJClassifiedsTheme::getStrippedPriceQueryFilter();
			}else{
				$se_price_from = $app->input->getInt('se_price_f',0);
				$se_price_to = $app->input->getInt('se_price_t',0);
				if($se_price_from){
					$where .= "AND ABS(i.price) >= ".$se_price_from." ";
				}
				if($se_price_to && $se_price_to>=$se_price_from){
					$where .= "AND ABS(i.price) <= ".$se_price_to." ";
				}
			}
			
			if($app->input->getVar('se_type_id')){
				$where .= "AND i.type_id IN (".$app->input->getVar('se_type_id').") ";
			}
			
			if($app->input->getInt('days_l')){
				$date_limit = JFactory::getDate('now - '.$app->input->getInt('days_l').' day')->toSQL();
				$where .= "AND i.date_start >= '".$date_limit."' ";
			}
			
			if($app->input->getInt('se_only_img',0)){
				$select .= ", img.img_c ";
				$join .= "LEFT JOIN (SELECT COUNT(img.id) as img_c, img.item_id FROM #__djcf_images img WHERE img.type='item' GROUP BY item_id) img ON i.id=img.item_id ";
				$where .= "AND img.img_c>0 ";
			}
			
			if($app->input->getInt('se_only_video',0)){
				$where .= "AND i.video!='' ";
			}
			
			if($app->input->getInt('se_only_auctions',0)){
				$where .= "AND i.auction=1 ";
			}
			
			if($app->input->getInt('se_only_buynow',0)){
				$where .= "AND i.buynow=1 ";
			}
			
			if($app->input->getInt('se_only_price_neg',0)){
				$where .= "AND i.price_negotiable=1 ";
			}

			$radius = $app->input->getFloat('se_radius',0);
			$se_postcode = $app->input->getVar('se_postcode','');
			$se_postcode_country = $app->input->getVar('se_postcode_c','');
			$se_address = $app->input->getVar('se_address','');
			$se_geoloc = $app->input->getVar('se_geoloc','');

			if(($se_postcode || $se_address) && !$radius){
				if(JText::_('COM_DJCLASSIFIEDS_SEARCH_NO_RADIUS_SPECIFIED') != 'COM_DJCLASSIFIEDS_SEARCH_NO_RADIUS_SPECIFIED'){
					$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_SEARCH_NO_RADIUS_SPECIFIED'), 'warning');
				}
			}
			
			if($radius > 0){
				$radius_unit = $app->input->getCmd('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( i.latitude ) ) * cos( radians( i.longitude ) - radians('.$coord_arr['lng'].') ) + sin( radians('.$coord_arr['lat'].') ) * sin( radians( i.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');
				}
			}
			
			if($app->input->getInt('se_also_18',0)==0){
				$where .= "AND c.restriction_18=0 ";
			}
		}else{
			if(!$catlist && (($par->get('restriction_18_allads',0)==1 && !isset($_COOKIE["djcf_warning18"]) || $par->get('restriction_18_allads',0)==2))){
				$where .= "AND c.restriction_18=0 ";
			}
			
			$reg_id = $app->input->getInt('rid',0);
			if($reg_id){
				$regs = DJClassifiedsRegion::getSubReg($reg_id,1);
				$reglist = $reg_id;
				foreach($regs as $r){
					$reglist .= ','. $r->id;
				}
				$where .= 'AND i.region_id IN ('.$reglist.') ';
			}else{
				$reglist = DJClassifiedsRegion::getDefaultRegionsIds();
				if($reglist){
					$where .= 'AND i.region_id IN ('.$reglist.') ';
				}
			}
		}

		$groups_acl = '0,'.implode(',', $user->getAuthorisedViewLevels());
		$where .= "AND c.access_view IN (" . $groups_acl . ") ";

		if(($par->get('column_distance','0') || $par->get('blog_distance','0')) && isset($_COOKIE["djcf_latlon"])){
			$distance_unit = $app->input->getCmd('column_distance_unit','km');
			$user_latlog = explode('_', $_COOKIE["djcf_latlon"]);									
			if($distance_unit=='mile'){										
				$distance_unit_v = 3959;
			}else{
				$distance_unit_v = 6371;
			}
			$select .= ', ( '.$distance_unit_v.' * acos( cos( radians('.$user_latlog[0].') ) * cos( radians( i.latitude ) ) * cos( radians( i.longitude ) - radians('.$user_latlog[1].') ) + sin( radians('.$user_latlog[0].') ) * sin( radians( i.latitude ) ) ) ) AS distance_latlon ';
		}

		if($app->input->getVar('format','')=='feed'){
			$ord = "i.date_start DESC";
		}else{
			$order = $app->input->getCmd('order', $par->get('items_ordering','date_sort'));
			$ord_t = $app->input->getCmd('ord_t', $par->get('items_ordering_dir','desc'));

			$sort_fields = DJClassifiedsField::getSortFields();

			$ord = "i.date_sort ";
			if($order=="title"){
				$ord="i.name ";
			}elseif($order=="cat"){
				$ord="c.name ";
			}elseif($order=="loc"){
				$ord="r.name ";
			}elseif($order=="price"){
				$ord="CAST(i.price AS DECIMAL(10,2)) ";
			}elseif($order=="display"){
				$ord="i.display ";
			}elseif($order=="date_a"){
				$ord="i.date_start ";
			}elseif($order=="date_e"){
				$ord="i.date_exp ";
			}elseif($order=="date_sort"){
				$ord="i.date_sort ";
			}elseif($order=="distance"){
				$ord = (strpos($select, 'distance_latlon') !== false ? "distance_latlon " : "i.date_exp ");
			}elseif($order=="random"){
				$rand_val = $app->getUserState('djclassifieds.items.rand_val', '');
				if(!$limitstart || !$rand_val){
					$rand_val = mt_rand();
					$app->setUserState('djclassifieds.items.rand_val', $rand_val);
				}
				$ord="RAND(".$rand_val.") ";
			}elseif($order=="reviews"){
				$ord = 'rev.avg_rate ';
				$select .= ', rev.avg_rate as rev_avg_rate ';
				$join .= "LEFT JOIN #__djrevs_objects rev ON i.id = rev.entry_id AND rev.item_type='com_djclassifieds.item' ";
			}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.item_id FROM #__djcf_fields f INNER JOIN #__djcf_fields_values fv ON f.id=fv.field_id AND f.id='".$sort_fields[$order]->id."') `".$sort_fields[$order]->name."` ON i.id=`".$sort_fields[$order]->name."`.item_id ";
			}

			$ord .= $ord_t == 'asc' ? 'ASC' : 'DESC';
		}
		
		if($par->get('show_archived',0)==2){
			$where .= "AND ((i.published=1 AND i.date_exp > '".$date_now."') OR i.published=2) ";				
		}else{
			$where .= "AND i.published=1 AND i.date_exp > '".$date_now."' ";
		}

		foreach($par->get('items_promotions', array()) as $p_name => $p_val){
			if($p_val != '-1'){
				$where .= "AND i.promotions " . (($p_val == '0') ? "NOT " : "") . "LIKE '%".$p_name."%' ";
			}
		}

		$account_type = $app->input->getInt('se_account_type', 0);
		if($account_type){
			$join .= "LEFT JOIN #__djcf_profiles p ON u.id=p.user_id ";
			$where .= "AND p.group_id = ".$account_type." ";
		}

		$app->triggerEvent('onPrepareDJClassifiedsListingQueryWhere', array(&$where, &$par));

		$query = "SELECT i.*, c.name c_name, c.alias c_alias, c.id c_id, c.rev_group_id, c.restriction_18 c_restr_18, c.schema_type c_schema_type, r.name r_name, r.id r_id, r.alias r_alias, u.name u_name, u.username as u_username, u.".$par->get('authorname','name')." as username, u.email as u_email, p.group_id, p.verified p_verified "
				.$select
				."FROM #__djcf_items i "
				."LEFT JOIN #__djcf_categories c ON i.cat_id=c.id "
				."LEFT JOIN #__djcf_regions r ON i.region_id=r.id "
				."LEFT JOIN #__users u ON i.user_id=u.id "
				."LEFT JOIN #__djcf_profiles p ON u.id=p.user_id "
				.$join
				."WHERE i.blocked=0 AND c.published!=0 "
				.$where
				.($having ? "HAVING ".$having." " : "")
				."ORDER BY i.special DESC, ".$ord;

		$app->triggerEvent('onDJClassifiedsListingQuery', array(&$query, &$limitstart, &$limit, 'items', &$par));

		self::$_items_query = $query;
		$items = $this->_getList($query, $limitstart, $limit);
		
		if($items){
			$uid_arr = array();
			$id_arr = array();
			foreach($items as $item){
				$id_arr[] = $item->id;
				if($item->user_id){
					$uid_arr[] = $item->user_id; 
				}
			}

			$custom_fields = $this->getFields(implode(',', $id_arr), $par);
			$items_img = DJClassifiedsImage::getAdsImages(implode(',', $id_arr), true);
			
			if($uid_arr){
				if(!$par->get('profile_avatar_source','')){
					$query = "SELECT * FROM #__djcf_images WHERE item_id IN (".implode(',', $uid_arr).") AND type='profile'";
					$db->setQuery($query);
					$profiles_img = $db->loadObjectList('item_id');
				}
				$query = "SELECT * FROM #__djcf_profiles WHERE user_id IN (".implode(',', $uid_arr).")";
				$db->setQuery($query);
				$profiles_details = $db->loadObjectList('user_id');
			}
			
			for($i=0;$i<count($items);$i++){
				$cf_found =0;
				//$items[$i]->fields_all = array();
				$items[$i]->fields_blog = array();
				$items[$i]->fields_table = array();
				$items[$i]->fields_table_col = array();
				// backward compatibility
				$items[$i]->fields = array();
				foreach($custom_fields as $cf){
					if($items[$i]->id==$cf->item_id){
						$cf_found =1;
						//$items[$i]->fields_all[$cf->field_id] = $cf;
						if($cf->in_blog){
							$items[$i]->fields_blog[$cf->field_id] = $cf;
						}
						if($cf->in_table==1){
							$items[$i]->fields_table_col[$cf->field_id] = $cf;
						}elseif($cf->in_table==2){
							$items[$i]->fields_table[$cf->field_id] = $cf;
						}
						// backward compatibility START
						if($cf->type=='date'){
							if($cf->value_date!='0000-00-00'){
								$items[$i]->fields[$cf->field_id] = $cf->value_date;
							}							
						}elseif($cf->type=='date_from_to'){
							if(!$cf->date_format){$cf->date_format = 'Y-m-d';}
							$date_start = $cf->value_date && $cf->value_date != '0000-00-00' ? DJClassifiedsTheme::formatDate(strtotime($cf->value_date),'','',$cf->date_format) : '';
							$date_end = $cf->value_date_to && $cf->value_date_to != '0000-00-00' ? DJClassifiedsTheme::formatDate(strtotime($cf->value_date_to),'','',$cf->date_format) : '';
							$items[$i]->fields[$cf->field_id] = $date_start.($date_end ? ' - '.$date_end : '');
						}elseif($cf->type=='image' && $cf->value){
							$items[$i]->fields[$cf->field_id] = '<img src="'.JUri::root().$cf->value.'">';						
						}else{
							$items[$i]->fields[$cf->field_id] = $cf->value;
						}
						// backward compatibility END
					}else if($cf_found){
						break;
					}
				}
				
				$items[$i]->images = !empty($items_img[$items[$i]->id]) ? $items_img[$items[$i]->id] : array();
				$items[$i]->extra_cats = array();
				$items[$i]->profile = array();

				if($items[$i]->user_id){
					$items[$i]->profile['img'] = '';
					if(isset($profiles_img[$items[$i]->user_id])){
						$items[$i]->profile['img'] = $profiles_img[$items[$i]->user_id];
					}
					if(isset($profiles_details[$items[$i]->user_id])){
						$items[$i]->profile['details'] = $profiles_details[$items[$i]->user_id];
					}
				}

				if($items[$i]->auction){
					$items[$i]->highest_bid = $this->getHighestBid($items[$i]->id);
				}

				DJClassifiedsField::convertOverwritableFieldsValues($items[$i], $par);

				$items[$i]->item_uri = DJClassifiedsSEO::getItemRoute($items[$i]->id.':'.$items[$i]->alias,$items[$i]->cat_id.':'.$items[$i]->c_alias,$items[$i]->region_id.':'.$items[$i]->r_alias);
				$items[$i]->profile_uri = $items[$i]->user_id ? DJClassifiedsSEO::getViewUri('profile', array('group_id' => $items[$i]->group_id)).'&uid='.DJClassifiedsSEO::getUserSlug($items[$i]->user_id, $items[$i]->username) : null;
			}
		}

		return $items;
	}
	
	function getCountItems()
	{
		$db = JFactory::getDBO();
		$query = "SELECT count(id) FROM (".self::$_items_query.") as q";
		$db->setQuery($query);
		$items_count = $db->loadResult();

		return $items_count;
	}

	function getFields($id_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 fv ON f.id = fv.field_id')
			->where('f.source IN (0,1)')
			->where('f.published = 1')
			->where('f.access IN ('.$ug.')')
			->where('(f.in_table > 0 OR f.in_blog = 1)')
			//->where('f.name NOT IN ('.implode(',', DJClassifiedsField::getOverwritableFieldNames(true)).')')
			->order('fv.item_id, f.ordering, f.label');
		if($id_list){
			$query->where('fv.item_id IN ('.$id_list.')');
		}
		$db->setQuery($query);
		$fields = $db->loadObjectList();
		
		DJClassifiedsAccess::filterFieldsByGroupAccess($fields);
		DJClassifiedsField::convertFieldsValues($fields, $par);
		
		return $fields;
	}

	function getListCustomFields() // backward compatibility
	{
		$db = JFactory::getDBO();

		$query = "SELECT f.* "
				."FROM #__djcf_fields f "
				."WHERE f.published=1 AND (f.in_table>0 OR f.in_blog=1) "
				."ORDER BY f.ordering";
		$db->setQuery($query);
		$cf = $db->loadObjectList('id');

		DJClassifiedsAccess::filterFieldsByGroupAccess($cf);

		return $cf;
	}

	function resetSearchFilters() // backward compatibility
	{
		$app = JFactory::getApplication();
		$db = JFactory::getDBO();
		$query = "SELECT * FROM #__djcf_fields WHERE published=1";
		$db->setQuery($query);
		$fields = $db->loadObjectList();
		
		foreach($fields as $f){
			if($f->search_type=='select_min_max' || $f->search_type=='inputbox_min_max' || $f->search_type=='date_min_max'){
				$app->setUserState('se_'.$f->id.'_min','');
				$app->setUserState('se_'.$f->id.'_max','');
			}else{
				$app->setUserState('se_'.$f->id,'');
			}
		}
	}
}
Site is undergoing maintenance

PACJA Events

Maintenance mode is on

Site will be available soon. Thank you for your patience!