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,'');
}
}
}
}