Current File : /home/pacjaorg/public_html/kmm/components/com_djclassifieds/controllers/item.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;
class DJClassifiedsControllerItem extends JControllerLegacy
{
public function display($cachable = false, $urlparams = Array())
{
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$user = JFactory::getUser();
$date_now = JFactory::getDate();
$par = $app->getParams('com_djclassifieds');
$id = $app->input->getInt('id', 0);
$token = $app->input->get('token', '');
$app->input->set('view','item');
if($id){
$query = "SELECT * FROM #__djcf_items WHERE id=".$id;
$db->setQuery($query);
$item = $db->loadObject();
if(!$item){
DJClassifiedsSEO::handleItemNotFound();
}
}else{ // if ad not chosen, use first user's ad
if(!$user->id){
DJClassifiedsSEO::redirectLogIn();
}
$query = "SELECT * FROM #__djcf_items WHERE user_id=".$user->id." LIMIT 1";
$db->setQuery($query);
$item = $db->loadObject();
if($item){
$app->input->set('id', $item->id);
}else{
DJCLassifiedsSEO::redirectWrongItem(DJClassifiedsSEO::getViewUri('additem'), 'COM_DJCLASSIFIEDS_ITEM_NOT_FOUND', 'warning');
}
}
$app->triggerEvent('onDJClassifiedsPrepareItem', array(&$item, &$par, 'item.display'));
$advert_available = true;
$cat_available = true;
if(!empty($item->cat_id)){
$query = "SELECT * FROM #__djcf_categories WHERE id=".$item->cat_id." LIMIT 1";
$db->setQuery($query);
$cat = $db->loadObject();
if(!$cat->published){
$cat_available = false;
}
}
if(empty($item->id) || $item->published==0 || $item->blocked==1){
$advert_available = false;
}elseif($item->published==2){
if($par->get('show_archived','1')){
$advert_available = true;
}else{
$advert_available = false;
}
}elseif($date_now >= $item->date_exp){
if($par->get('access_expired','0') && JFactory::getDate('now - '.(int)$par->get('access_expired').' day') < $item->date_exp){
$advert_available = true;
}else{
$advert_available = false;
}
}
$own_item = false;
if(($user->id && $user->id == $item->user_id) || (!$user->id && $token && $token == $item->token)){
$own_item = true;
$advert_available = true;
if($item->blocked){
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_BLOCKED_ADVERT'), 'notice');
}
}
if($par->get('buynow','0') && $user->id){
$query = "SELECT id FROM #__djcf_orders WHERE item_id=".$item->id." AND user_id=".$user->id;
$db->setQuery($query);
$is_buyer = $db->loadResult();
if($is_buyer){
$advert_available = true;
}
}
if($par->get('auctions') && $user->id){
$query = "SELECT win FROM #__djcf_auctions WHERE item_id=".$item->id." AND user_id=".$user->id;
$db->setQuery($query);
$is_winner = $db->loadResult();
if($is_winner){
$advert_available = true;
}
}
if($par->get('admin_can_edit_delete','0') && $user->authorise('core.admin', 'com_djclassifieds')){
$advert_available = true;
}
if(!$advert_available || !$cat_available){
if($app->input->get('exp_notif', '')){ // expire notification email
$uri = JUri::getInstance();
$uri->delVar('exp_notif');
$login_url = new JUri(JRoute::_('index.php?option=com_users&view=login', false));
$login_url->setVar('return', base64_encode($uri));
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_PLEASE_LOGIN'), 'notice');
$app->redirect($login_url);
}
DJClassifiedsSEO::handleItemNotFound();
}
if($app->input->get('prev')){
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_PREVIEW_OF_ADVERT'), 'notice');
}
if($item->published==2){
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_ARCHIVE_ADVERT'), 'notice');
}elseif($date_now >= $item->date_exp){
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_ITEM_EXPIRED'), 'warning');
}elseif($item->published==0){
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_UNPUBLISHED_ADVERT'), 'notice');
}
if(!$own_item){
$query = "UPDATE #__djcf_items SET display=display+1 WHERE id=".$id;
$db->setQuery($query);
$db->execute();
}
$app->setUserState('djcf.pre_edit_page', array('view' => 'item', 'id' => $id, 'juri' => JUri::getInstance()));
parent::display();
}
function ask()
{
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$user = JFactory::getUser();
$par = $app->getParams('com_djclassifieds');
$model = $this->getModel('item');
$id = $app->input->getInt('item_id', 0);
$msg = strip_tags($app->input->getStr('ask_message'));
$send_email = false;
$app->setUserState('askform_name', $app->input->getStr('ask_name'));
$app->setUserState('askform_email', $app->input->getStr('ask_email'));
$app->setUserState('askform_message', $app->input->getStr('ask_message'));
$app->setUserState('djcf.askform.data', $app->input->post->getArray());
$item = $model->getItemById($id);
if($par->get('ask_seller_type','0') == 0 && !$user->id){
DJClassifiedsSEO::redirectLogIn($item->item_uri);
}
$date_last5 = JFactory::getDate('now - '.(int)$par->get('ask_limit_one', 5).' minute')->toSQL();
$date_lasth = JFactory::getDate('now - 1 hour')->toSQL();
$user_ip = $app->input->server->getStr('REMOTE_ADDR');
if($user->id){
$query = "SELECT COUNT(id) FROM #__djcf_itemsask WHERE user_id=".$user->id." AND item_id=".$id." AND date>".$db->q($date_last5);
$db->setQuery($query);
$check = $db->loadResult();
if($check > 0){
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_ASK_MESSAGE_LIMIT'), 'warning');
$app->redirect(JRoute::_($item->item_uri, false));
}
if($par->get('ask_limit_hour', 15)){
$query = "SELECT COUNT(id) FROM #__djcf_itemsask WHERE user_id=".$user->id." AND date>".$db->q($date_lasth);
$db->setQuery($query);
$check = $db->loadResult();
if($check > $par->get('ask_limit_hour',15)){
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_ASK_MESSAGE_LIMIT_HOUR'), 'warning');
$app->redirect(JRoute::_($item->item_uri, false));
}
}
if(!DJClassifiedsAccess::checkAskFormFiles()){
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_MESSAGE_NOT_SENT'), 'warning');
$app->redirect(JRoute::_($item->item_uri.'&ae=1', false));
}
$custom_fields_msg = DJClassifiedsField::getAskFormFieldsForEmail();
$query = "INSERT INTO #__djcf_itemsask(`item_id`, `user_id`, `ip_address`, `message`, `date`, `custom_fields`) "
."VALUES(".$id.", ".$user->id.", ".$db->q($user_ip).", ".$db->q($db->escape($msg)).",".$db->q(JFactory::getDate()->toSQL()).", ".$db->q($db->escape($custom_fields_msg)).")";
$db->setQuery($query);
$db->execute();
$send_email = true;
}else if($par->get('ask_seller_type','0') == 1){
if(DJClassifiedsAccess::isCaptchaValid()){
$query = "SELECT COUNT(id) FROM #__djcf_itemsask WHERE ip_address=".$db->q($user_ip)." AND item_id=".$id." AND date>".$db->q($date_last5);
$db->setQuery($query);
$check = $db->loadResult();
if($check > 0){
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_ASK_MESSAGE_LIMIT'), 'warning');
$app->redirect(JRoute::_($item->item_uri, false));
}
if($par->get('ask_limit_hour', 15)){
$query = "SELECT COUNT(id) FROM #__djcf_itemsask WHERE ip_address=".$db->q($user_ip)." AND date>".$db->q($date_lasth);
$db->setQuery($query);
$check = $db->loadResult();
if($check > $par->get('ask_limit_hour',15)){
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_ASK_MESSAGE_LIMIT_HOUR'), 'warning');
$app->redirect(JRoute::_($item->item_uri, false));
}
}
if(!DJClassifiedsAccess::checkAskFormFiles()){
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_MESSAGE_NOT_SENT'), 'warning');
$app->redirect(JRoute::_($item->item_uri.'&ae=1', false));
}
$custom_fields_msg = DJClassifiedsField::getAskFormFieldsForEmail();
$query = "INSERT INTO #__djcf_itemsask(`item_id`, `user_id`, `ip_address`, `message`, `date`, `custom_fields`) "
."VALUES(".$id.", 0, ".$db->q($user_ip).", ".$db->q($db->escape($msg)).",".$db->q(JFactory::getDate()->toSQL()).", ".$db->q($db->escape($custom_fields_msg)).")";
$db->setQuery($query);
$db->execute();
$send_email = true;
}else{
// $app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_INVALID_CODE'), 'error');
$app->redirect(JRoute::_($item->item_uri.'&ae=1', false));
}
}
if($send_email){
$author = array();
$author['name'] = $app->input->getStr('ask_name');
$author['email'] = $app->input->getStr('ask_email');
$author['user_id'] = '';
$author['profile'] = '';
if($user->id){
$author['user_id'] = $user->id;
$author['profile'] = JRoute::link('site', DJClassifiedsSEO::getViewUri('profile', array('group_id' => $model->getUserFieldGroup($user->id))).'&uid='.DJClassifiedsSEO::getUserSlug($user->id, $model->getAuthorName($user->id, $par)), true, null, true);
}
$replyto = $author['email'];
$replytoname = $author['name'];
$email_copy_arr = DJClassifiedsField::getAskFormFieldsEmailCopy($id, $par);
$sent = DJClassifiedsNotify::messageAskFormContact($item,$author,$msg,$_FILES,$replyto,$replytoname,$custom_fields_msg,$email_copy_arr['cc'],$email_copy_arr['bcc']);
if(!is_object($sent)){
$app->setUserState('askform_name', null);
$app->setUserState('askform_email', null);
$app->setUserState('askform_message', null);
$app->setUserState('djcf.askform.data', null);
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_MESSAGE_SEND'), 'success');
$app->redirect(JRoute::_($item->item_uri, false));
}else{
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_MESSAGE_NOT_SENT'), 'warning');
$app->redirect(JRoute::_($item->item_uri, false));
}
}
}
function abuse()
{
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$user = JFactory::getUser();
$par = $app->getParams('com_djclassifieds');
$id = $app->input->getInt('item_id', 0);
$msg = strip_tags($app->input->getStr('abuse_message'));
$model = $this->getModel('item');
$item = $model->getItemById($id);
if($par->get('abuse_reporting_type','0') == 1 || $user->id){
if($user->id){
$query = "SELECT COUNT(id) FROM #__djcf_items_abuse WHERE item_id=".$id." AND user_id=".$user->id;
$db->setQuery($query);
$a_count = $db->loadResult();
if($a_count>0){
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_ALREADY_SEND_ABUSE'), 'warning');
$app->redirect(JRoute::_($item->item_uri, false));
}
}elseif(!DJClassifiedsAccess::isCaptchaValid()){
// $app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_INVALID_CODE'), 'error');
$app->redirect(JRoute::_($item->item_uri, false));
}
$query = "INSERT INTO #__djcf_items_abuse(`item_id`,`user_id`,`message`) "
."VALUES ('".$id."','".$user->id."','".addslashes($msg)."')";
$db->setQuery($query);
$db->execute();
if($par->get('notify_user_email','')){
$mailto = DJClassifiedsNotify::getAdminMailto();
}else{
$mailto = $app->getCfg('mailfrom');
}
DJClassifiedsNotify::messageAbuseFormContact($item,$user,$msg,$mailto);
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_MESSAGE_SEND'), 'success');
$app->redirect(JRoute::_($item->item_uri, false));
}else{
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_PLEASE_LOGIN'), 'warning');
$app->redirect(JRoute::_($item->item_uri, false));
}
}
function deleteToken()
{
$app = JFactory::getApplication();
$model = $this->getModel('item');
$token = $app->input->get('token', '');
$item = $model->getItemByToken($token);
if(!$item){
DJClassifiedsSEO::redirectWrongItem(DJClassifiedsSEO::getCategoryRoute('0:all'));
}
$this->delete($item->id);
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_AD_DELETED'), 'success');
$app->redirect(JRoute::_(DJClassifiedsSEO::getCategoryRoute('0:all'), false));
}
function delete($_id = null)
{
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$par = $app->getParams('com_djclassifieds');
$model = $this->getModel('item');
$id = $_id !== null ? $_id : $app->input->getInt('id', 0);
if($par->get('user_ad_delete',0)==1){
$this->archive($id);
}else{
$item = $model->getItemById($id);
if(!DJClassifiedsAccess::canDeleteItem($item)){
DJClassifiedsSEO::redirectWrongItem(DJClassifiedsSEO::getViewUri('useritems'));
}
if($par->get('user_ad_delete_cat_limit','1') == '0' && $item->date_exp > JFactory::getDate()->toSQL()){
$query = "SELECT ads_limit FROM #__djcf_categories WHERE id=".$item->cat_id;
$db->setQuery($query);
$cat_ads_limit = $db->loadResult();
if($cat_ads_limit){
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_CATEGORY_ADS_LIMIT_DELETE_NOT_ALLOWED'), 'error');
$app->redirect(JRoute::_(DJClassifiedsSEO::getViewUri('useritems'), false));
}
}
$app->triggerEvent('onBeforeDJClassifiedsDeleteAdvert', array($item));
$query = "SELECT * FROM #__djcf_images WHERE item_id=".$item->id." AND type='item'";
$db->setQuery($query);
$item_images = $db->loadObjectList('id');
if($item_images){
foreach($item_images as $item_img){
$path_to_delete = JPATH_ROOT.$item_img->path.$item_img->name;
if (JFile::exists($path_to_delete.'.'.$item_img->ext)){
JFile::delete($path_to_delete.'.'.$item_img->ext);
}
if($par->get('leave_small_th','0')==0){
if (JFile::exists($path_to_delete.'_ths.'.$item_img->ext)){
JFile::delete($path_to_delete.'_ths.'.$item_img->ext);
}
}
if (JFile::exists($path_to_delete.'_thm.'.$item_img->ext)){
JFile::delete($path_to_delete.'_thm.'.$item_img->ext);
}
if (JFile::exists($path_to_delete.'_thb.'.$item_img->ext)){
JFile::delete($path_to_delete.'_thb.'.$item_img->ext);
}
}
}
$query = "DELETE FROM #__djcf_items WHERE id=".$item->id;
$db->setQuery($query);
$db->execute();
$query = "DELETE FROM #__djcf_fields_values WHERE item_id=".$item->id;
$db->setQuery($query);
$db->execute();
$query = "DELETE FROM #__djcf_payments WHERE item_id=".$item->id;
$db->setQuery($query);
$db->execute();
$query = "DELETE FROM #__djcf_images WHERE item_id=".$item->id." AND type='item'";
$db->setQuery($query);
$db->execute();
$app->triggerEvent('onAfterDJClassifiedsDeleteAdvert', array($item));
$message = JText::_('COM_DJCLASSIFIEDS_AD_DELETED');
}
if($_id === null){
$app->enqueueMessage($message, 'success');
$app->redirect(JRoute::_(DJClassifiedsSEO::getViewUri('useritems'), false));
}
}
function renew() // moved to item.save since 3.8.1
{
die('3.8.1 legacy error');
}
function archive($_id = null)
{
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$model = $this->getModel('item');
$id = $_id !== null ? $_id : $app->input->getInt('id', 0);
$item = $model->getItemById($id);
if(!DJClassifiedsAccess::canEditItem($item)){
DJClassifiedsSEO::redirectWrongItem(DJClassifiedsSEO::getViewUri('useritems'));
}
$app->triggerEvent('onBeforeDJClassifiedsItemArchive', array($item));
$query = "UPDATE #__djcf_items SET published=2 WHERE id=".$id;
$db->setQuery($query);
$db->execute();
if($_id === null){
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_ADVERT_MOVED_TO_ARCHIVE'), 'success');
$app->redirect(JRoute::_(DJClassifiedsSEO::getViewUri('useritems'), false));
}
}
function block($_id = null)
{
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$model = $this->getModel('item');
$par = JComponentHelper::getParams('com_djclassifieds');
$id = $_id !== null ? $_id : $app->input->getInt('id', 0);
$item = $model->getItemById($id);
if($par->get('allow_user_block_ad','0')=='0' || !DJClassifiedsAccess::canEditItem($item)){
DJClassifiedsSEO::redirectWrongItem(DJClassifiedsSEO::getViewUri('useritems'));
}
$app->triggerEvent('onBeforeDJClassifiedsItemBlock', array($item));
$query = "UPDATE #__djcf_items SET blocked=1 WHERE id='".$id."' LIMIT 1";
$db->setQuery($query);
$db->execute();
if($_id === null){
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_ADVERT_BLOCKED'), 'success');
$app->redirect(JRoute::_(DJClassifiedsSEO::getViewUri('useritems'), false));
}
}
function activate($_id = null)
{
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$model = $this->getModel('item');
$id = $_id !== null ? $_id : $app->input->getInt('id', 0);
$item = $model->getItemById($id);
if(!DJClassifiedsAccess::canEditItem($item)){
DJClassifiedsSEO::redirectWrongItem(DJClassifiedsSEO::getViewUri('useritems'));
}
$app->triggerEvent('onBeforeDJClassifiedsItemUnblock', array($item));
$query = "UPDATE #__djcf_items SET blocked=0 WHERE id='".$id."' LIMIT 1";
$db->setQuery($query);
$db->execute();
if($_id === null){
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_ADVERT_ACTIVATED'), 'success');
$app->redirect(JRoute::_(DJClassifiedsSEO::getViewUri('useritems'), false));
}
}
function getSearchFields()
{
header("Content-type: text/html; charset=utf-8");
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$par = $app->getParams('com_djclassifieds');
$user = JFactory::getUser();
$ug = implode(',', $user->getAuthorisedViewLevels());
$cid = $app->input->getInt('cat_id', 0);
$mod_id = $app->input->getInt('mod_id', 0);
$resultsFields = $app->triggerEvent('onBeforeDJClassifiedsDisplaySearchFields', array(&$par));
if($resultsFields){
echo trim(implode("\n", $resultsFields));
}
if($cid){
$cat_tree = DJClassifiedsCategory::getSEOParentPath($cid);
$parent_cid = (int)end($cat_tree);
}else{
$parent_cid = '0';
}
$query = $db->getQuery(true);
$query->select('f.*')
->from('#__djcf_fields f')
->where('f.published = 1')
->where('f.access IN ('.$ug.')')
->where('f.search_type != ""')
->where('f.in_search = 1')
->where('f.source = 0');
if($cid){
$query->select('fx.ordering cat_ordering, fx.cat_id')->join('LEFT', '#__djcf_fields_xref fx ON f.id = fx.field_id')->where('fx.cat_id = '.$cid);
}else{
$query->select('0 cat_ordering, 0 cat_id')->where('f.in_search_on_start = 1');
}
$query->order('search_ordering, cat_ordering, ordering');
$app->triggerEvent('onDJClassifiedsGetFormFieldsQuery', array(&$query, 'search.category'));
$db->setQuery($query);
$fields_list = $db->loadObjectList();
$query_contact = $db->getQuery(true);
$query_contact->select(array('f.*', '0 cat_ordering', '0 cat_id'))
->from('#__djcf_fields f')
->where('f.published = 1')
->where('f.access IN ('.$ug.')')
->where('f.search_type != ""')
->where('f.in_search = 1')
->where('f.source = 1');
$query->order('search_ordering, cat_ordering, ordering');
$app->triggerEvent('onDJClassifiedsGetFormFieldsQuery', array(&$query_contact, 'search.contact'));
$db->setQuery($query_contact);
$fields_list_contact = $db->loadObjectList();
$fields_list = array_merge($fields_list, $fields_list_contact);
DJClassifiedsAccess::filterFieldsByGroupAccess($fields_list);
foreach($fields_list as $f){
if(isset($parent_cid) && ($parent_cid != $app->getUserState('last_parent_cid') || !$app->input->get('se'))){
$app->setUserState('se_'.$f->id,'');
$app->setUserState('se_'.$f->id.'_min','');
$app->setUserState('se_'.$f->id.'_max','');
}
echo DJClassifiedsField::renderSearchFormField($f, $mod_id);
}
$app->close();
}
function addFavourite() // backward compatibility
{
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$user = JFactory::getUser();
$par = $app->getParams('com_djclassifieds');
$model = $this->getModel('item');
$id = $app->input->getInt('id', 0);
$itemid = $app->input->getVar('Itemid');
$item = $model->getItemById($id);
if($par->get('favourite','1')){
if($user->id){
if($item->user_id==$user->id){
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_FAVOURITES_AUTHOR_ALERT'), 'warning');
$app->redirect(JRoute::_($item->item_uri, false));
}else{
$query = "SELECT COUNT(id) FROM #__djcf_favourites WHERE item_id=".$id." AND user_id=".$user->id;
$db->setQuery($query);
$user_fav = $db->loadResult();
if(!$user_fav){
$query = "INSERT INTO #__djcf_favourites (`item_id`, `user_id`) VALUES (".$id.", ".$user->id.")";
$db->setQuery($query);
$db->execute();
}
}
}else{
DJClassifiedsSEO::redirectLogIn('index.php?option=com_djclassifieds&view=item&task=addFavourite&id='.$id.'&Itemid='.$itemid);
}
}else{
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_FUNCTION_NOT_AVAILABLE'), 'error');
$app->redirect(JRoute::_($item->item_uri, false));
}
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_AD_ADDED_TO_FAVOURITES'), 'success');
$app->redirect(JRoute::_($item->item_uri, false));
}
function removeFavourite()
{
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$user = JFactory::getUser();
$par = $app->getParams('com_djclassifieds');
$model = $this->getModel('item');
$id = $app->input->getInt('id', 0);
$cid = $app->input->getInt('cid', 0);
$itemid = $app->input->getVar('Itemid');
$item = $model->getItemById($id);
if($par->get('favourite','1')){
if($user->id){
$query="DELETE FROM #__djcf_favourites WHERE item_id=".$id." AND user_id=".$user->id." ";
$db->setQuery($query);
$db->execute();
}else{
DJClassifiedsSEO::redirectLogIn('index.php?option=com_djclassifieds&view=item&task=removeFavourite&cid='.$cid.'&id='.$id.'&Itemid='.$itemid);
}
}else{
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_FUNCTION_NOT_AVAILABLE'), 'error');
$app->redirect(JRoute::_($item->item_uri, false));
}
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_AD_REMOVED_FROM_FAVOURITES'), 'success');
$app->redirect(JRoute::_($item->item_uri, false));
}
function driveDirections()
{
$app = JFactory::getApplication();
$saddr = $app->input->getVar('saddr');
$daddr = $app->input->getVar('daddr');
$lat = $app->input->getFloat('latitude');
$lon = $app->input->getFloat('longitude');
$daddr = $lat > 0 && $lon > 0 ? (float)$lat.','.(float)$lon : $daddr;
$app->redirect('http://maps.google.com/maps?saddr='.$saddr.'&daddr='.$daddr);
}
function saveBid($assist_retry = false)
{
header("Content-type: text/html; charset=utf-8");
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$user = JFactory::getUser();
$par = $app->getParams('com_djclassifieds');
$model = $this->getModel('item');
if(!$user->id){
echo '<div id="djbid_alert">'.JText::_('COM_DJCLASSIFIEDS_PLEASE_LOGIN').'</div>';
$app->close();
}
$id = $app->input->getInt('id', 0);
$bid = $app->input->getFloat('bid',0);
$date_now = JFactory::getDate()->toSQL();
$query = "SELECT * FROM #__djcf_items WHERE id=".$id." AND published=1 AND date_exp >= ".$db->q($date_now);
$db->setQuery($query);
$item = $db->loadObject();
if(!$item){
echo '<div id="djbid_alert">'.JText::_('COM_DJCLASSIFIEDS_WRONG_AD').'</div>';
$app->close();
}
$app->triggerEvent('onDJClassifiedsPrepareItem', array(&$item, &$par, 'item.saveBid'));
$bids = $model->getBids($id, $par->get('bids_displayed',5));
$min_bid = $model->getMinBid($item, $bids);
$form_price = $min_bid;
$bid_error = 0;
$show_form = 1;
$bid_message = JText::_('COM_DJCLASSIFIEDS_OFFER_PUBLISHED');
if($bid > 0){
if($par->get('buynow','0') && $item->buynow && $bid >= $item->price){
$bid_error = 1;
$bid_message = JText::_('COM_DJCLASSIFIEDS_YOUR_OFFER_NEEDS_TO_BE_LOWER_THAN_BUYNOW_PRICE');
}
$last_bid = $bids ? $bids[0] : null;
if($last_bid && !$item->auction_assist){
if($last_bid->user_id == $user->id && (!$item->price_reserve || $last_bid->price >= $item->price_reserve)){
$bid_error = 1;
$bid_message = JText::_('COM_DJCLASSIFIEDS_YOUR_OFFER_IS_LAST_YOU_CAN_BID_ONLY_OTHER_USERS');
}
}
if($item->user_id == $user->id){
$bid_error = 1;
$bid_message = JText::_('COM_DJCLASSIFIEDS_YOU_CANT_BID_YOUR_ADVERT');
}
if(!$bid_error){
if(!$item->auction_assist){
if($bid < $min_bid){
$bid_error = 1;
$form_price = $min_bid;
$bid_message = JText::_('COM_DJCLASSIFIEDS_OFFER_SMALLER_THAN_LIMIT').' '.DJClassifiedsTheme::priceFormat($form_price,$item->currency);
}elseif($item->bid_max > 0){
$max_bid = $min_bid + $item->bid_max;
if($item->bid_max && $bid>$max_bid){
$bid_error = 1;
$form_price = $max_bid;
$bid_message = JText::_('COM_DJCLASSIFIEDS_OFFER_BIGGER_THAN_LIMIT').' '.DJClassifiedsTheme::priceFormat($form_price,$item->currency);
}
}
}
if(!$bid_error){
$user_ip = $_SERVER['REMOTE_ADDR'];
if(!$item->auction_assist){
$win = 0;
if($bid >= $item->price_reserve && $item->bid_autoclose == 1){
$win = 1;
}
$query = "INSERT INTO #__djcf_auctions(`item_id`, `user_id`, `ip_address`,`date`,`price`,`win`) "
."VALUES(".$id.", ".$user->id.", ".$db->q($user_ip).", ".$db->q($date_now).", ".$bid.", ".$win.")";
$db->setQuery($query);
$db->execute();
$bids = $model->getBids($id, $par->get('bids_displayed',5)); // get updated bids
$form_price = $model->getMinBid($item, $bids); // new min bid
if($win){
$query = "UPDATE #__djcf_items SET notify=2 WHERE id=".$item->id;
$db->setQuery($query);
$db->execute();
}
DJClassifiedsNotify::notifyAuctionsBidAuthor($id,$user,$bid);
DJClassifiedsNotify::notifyAuctionsBidBidder($id,$user,$bid);
if($last_bid){
DJClassifiedsNotify::notifyAuctionsBidOutbid($id,$user,$bid,$last_bid);
}
$app->triggerEvent('onAfterDJClassifiedsBidAuction', array($item,$user,$bid));
if($win){
DJClassifiedsNotify::notifyAuctionsWinAuthor($id,$user,$bid);
DJClassifiedsNotify::notifyAuctionsWinBidder($id,$user,$bid);
$app->triggerEvent('onAfterDJClassifiedsWinAuction', array($item,$user,$bid));
}
}else{ // assisted/automated bidding
$form_price = $bid;
$user_id_assist = $user->id;
$user_max_bid = $model->getUserMaxBid($id, $user->id);
if(!$assist_retry){
if($user_max_bid && $bid <= $user_max_bid){
$bid_error = 1;
$bid_message = JText::_('COM_DJCLASSIFIEDS_YOUR_NEW_MAX_BID_NEEDS_TO_BE_HIGHER_THAN_YOUR_LAST_ONE');
}elseif($bid < $min_bid){
$bid_error = 1;
$form_price = $min_bid;
$bid_message = JText::_('COM_DJCLASSIFIEDS_OFFER_SMALLER_THAN_LIMIT').' '.DJClassifiedsTheme::priceFormat($form_price, $item->currency);
}else{
$query = "INSERT INTO #__djcf_auctions_assist(item_id, user_id, max_bid, date) VALUES(".$id.", ".$user->id.", ".$bid.", ".$db->q($date_now).")";
$db->setQuery($query);
$db->execute();
if($user_max_bid){
$bid_message = JText::_('COM_DJCLASSIFIEDS_YOUR_MAX_BID_HAS_BEEN_UPDATED');
}
}
}
if(!$bid_error){
if($last_bid){
if($last_bid->user_id != $user->id){
$query = "SELECT * FROM #__djcf_auctions_assist WHERE item_id=".$id." AND user_id!=".$user->id." AND max_bid>".$last_bid->price." ORDER BY max_bid ASC";
$db->setQuery($query);
$auction_max_bids = $db->loadObjectList();
if($auction_max_bids){
foreach($auction_max_bids as $max){
if($max->max_bid >= $bid){
$bid_assist = $bid;
$user_id_assist = $max->user_id;
break;
}
}
if(empty($winning_bid)){
foreach($auction_max_bids as $max){
if($max->max_bid >= $min_bid){
if($max->max_bid < $bid){
$bid_assist = $max->max_bid;
$retry = true; // found other user's max bid higher than the min bid - save bid retry needed after auction insert
}else{
$bid_assist = $bid;
}
$user_id_assist = $max->user_id;
break;
}
}
}
}
if(!empty($bid_assist)){ // new auction insert for one of the previous bidders
if($last_bid->user_id != $user_id_assist){
DJClassifiedsNotify::notifyAuctionsBidOutbid($id,JFactory::getUser($user_id_assist),$bid_assist,$last_bid);
}
$bid_message = JText::_('COM_DJCLASSIFIEDS_YOUR_BID_IS_NOT_THE_HIGHEST_ONE');
$bid_error = 1;
}elseif($bid >= $min_bid){ // new auction insert for the bidding user
$bid_assist = $min_bid;
$bid_message = JText::_('COM_DJCLASSIFIEDS_YOUR_BID_IS_THE_HIGHEST_ONE');
}else{
$bid_message = JText::_('COM_DJCLASSIFIEDS_YOUR_BID_IS_NOT_THE_HIGHEST_ONE');
}
}
}else{
$bid_assist = $min_bid;
}
if(!empty($bid_assist)){
$all_auction_bids = $model->getBids($id);
$new_bidder = true;
foreach($all_auction_bids as $auction_bids){
if($auction_bids->user_id == $user_id_assist){
$new_bidder = false;
break;
}
}
if($new_bidder){
DJClassifiedsNotify::notifyAuctionsBidAuthor($id,$user,$bid);
DJClassifiedsNotify::notifyAuctionsBidBidder($id,$user,$bid);
}
if($user_id_assist != $user->id){
$user_ip = '';
}
$query = "INSERT INTO #__djcf_auctions(`item_id`, `user_id`, `ip_address`, `date`, `price`, `win`, `assist`) "
."VALUES(".$id.", ".$user_id_assist.", ".$db->q($user_ip).", ".$db->q($date_now).", ".$bid_assist.", 0, 1)";
$db->setQuery($query);
$db->execute();
$bids = $model->getBids($id, $par->get('bids_displayed',5)); // get updated bids
if(!empty($retry)){
$this->saveBid(true);
}
}
}
}
}
}
}else{
$bid_error = 1;
$bid_message = JText::_('COM_DJCLASSIFIEDS_PLEASE_ENTER_PRICE_VALUE');
}
echo DJClassifiedsTheme::renderLayout('auctionform', array('bids' => $bids, 'item' => $item, 'show_form' => $show_form, 'bid_active' => true, 'min_bid' => $form_price, 'user' => $user, 'par' => $par));
echo '<div id="'.($bid_error ? 'djbid_alert' : 'djbid_message').'" class="djbid-msg">'.$bid_message.'</div>';
$app->close();
}
function loadBids()
{
header("Content-type: text/html; charset=utf-8");
$app = JFactory::getApplication();
$user = JFactory::getUser();
$par = $app->getParams('com_djclassifieds');
$model = $this->getModel('item');
DJClassifiedsAuction::updateAuctions();
$item_id = $app->input->getInt('item_id', 0);
$user_id = $app->input->getInt('user_id', 0);
$item = $model->getItemById($item_id);
$bids = $model->getBids($item_id, $par->get('bids_displayed',5));
$item->date_exp = DJClassifiedsAuction::auctionAutoExtend($item, $bids, $par);
$bid_active = DJClassifiedsAuction::isBidActive($item, $bids);
$min_bid = null;
if($user->id && !$user_id){ // just logged in - show bid input
$min_bid = $item->auction_assist ? $model->getUserMaxBid($item->id, $user->id) : $model->getMinBid($item, $bids);
}
echo DJClassifiedsTheme::renderLayout('auctionform', array('bids' => $bids, 'item' => $item, 'show_form' => true, 'bid_active' => $bid_active, 'min_bid' => $min_bid, 'user' => $user, 'par' => $par));
$app->close();
}
function loadPrice()
{
header("Content-type: text/html; charset=utf-8");
$app = JFactory::getApplication();
$par = $app->getParams('com_djclassifieds');
$model = $this->getModel('item');
$item_id = $app->input->getInt('item_id', 0);
$item = $model->getItemById($item_id);
$highest_bid = $model->getHighestBid($item_id);
echo DJClassifiedsTheme::renderLayout('price', array('item' => $item, 'highest_bid' => $highest_bid, 'show_buynow_form' => true, 'context' => 'item', 'par' => $par));
$app->close();
}
function delBid()
{
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$user = JFactory::getUser();
$model = $this->getModel('item');
$id = $app->input->getInt('id', 0);
$bid = $app->input->getInt('bid', 0);
if(!$user->id){
DJClassifiedsSEO::redirectLogIn();
}
$item = $model->getItemById($id);
if(!$item){
DJClassifiedsSEO::redirectWrongItem();
}
if(!$item->user_id || $item->user_id != $user->id){
DJClassifiedsSEO::redirectWrongItem($item->item_uri);
}
$query = "SELECT * FROM #__djcf_auctions WHERE item_id=".$item->id." AND id=".$bid;
$db->setQuery($query);
$bid_to_delete = $db->loadObject();
if($bid_to_delete){
$query = "DELETE FROM #__djcf_auctions_assist WHERE item_id=".$bid_to_delete->item_id." AND user_id=".$bid_to_delete->user_id;
$db->setQuery($query);
$db->execute();
$query = "DELETE FROM #__djcf_auctions WHERE id=".$bid_to_delete->id;
$db->setQuery($query);
$db->execute();
$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_BID_DELETED'), 'success');
}
$app->redirect(JRoute::_($item->item_uri, false));
}
public function getRegionSelect()
{
header("Content-type: text/html; charset=utf-8");
$app = JFactory::getApplication();
$model = $this->getModel('item');
$id = $app->input->getInt('reg_id', 0);
$mod_id = $app->input->getInt('mod_id', 0);
DJClassifiedsTheme::loadLanguage('mod_djclassifieds_search', '/modules/mod_djclassifieds_search');
if($id>0){
$module = JModuleHelper::getModuleById((string)$mod_id);
$mod_params = new JRegistry($module->params);
$ord = $mod_params->get('loc_ordering','ordering,name');
$regions = $model->getRegions($ord, $id);
if($regions){
if($mod_params->get('loc_hide_empty','0')){
$not_empty_reg_ids = array_map(function($i){
return $i->id;
}, DJClassifiedsRegion::getRegAllItemsCount(1,1));
foreach($regions as $key => $reg){
if(!in_array($reg->id, $not_empty_reg_ids)){
unset($regions[$key]);
}
}
if(!$regions){
$app->close();
}
}
$parent_reg = $model->getRegion($id);
echo DJClassifiedsTheme::renderLayout('searchselectreg', array(
'regions' => $regions,
'reg_id' => $id,
'mod_id' => $mod_id,
'empty_opt_text' => JText::sprintf((!empty($parent_reg->header_text) ? $parent_reg->header_text : 'MOD_DJCLASSIFIEDS_SEARCH_LOCATION_SELECTOR_EMPTY_VALUE'), JText::_($parent_reg->name)),
'params' => $mod_params
));
}
}
$app->close();
}
public function getCategorySelect()
{
header("Content-type: text/html; charset=utf-8");
$app = JFactory::getApplication();
$model = $this->getModel('item');
$id = $app->input->getInt('cat_id', 0);
$pid = $app->input->getVar('cat_id');
$mod_id = $app->input->getInt('mod_id', 0);
DJClassifiedsTheme::loadLanguage('mod_djclassifieds_search', '/modules/mod_djclassifieds_search');
if($id>0 && !strstr($pid, 'p')){
$module = JModuleHelper::getModuleById((string)$mod_id);
$mod_params = new JRegistry($module->params);
$ord = $mod_params->get('cat_ordering','ord');
$ord = $ord == 'ord' ? 'ordering' : $ord;
$cats = $model->getCategories($ord, $id, false);
if($cats){
if($mod_params->get('cat_hide_empty','0')){
$not_empty_cat_ids = array_map(function($i){
return $i->id;
}, DJClassifiedsCategory::getCatAllItemsCount(1,'ord',1));
foreach($cats as $key => $cat){
if(!in_array($cat->id, $not_empty_cat_ids)){
unset($cats[$key]);
}
}
if(!$cats){
$app->close();
}
}
$parent_cat = $model->getCategory($id);
echo DJClassifiedsTheme::renderLayout('searchselectcat', array(
'cats' => $cats,
'cat_id' => $id,
'mod_id' => $mod_id,
'empty_opt_text' => $mod_params->get('cat_select_type','0')==0 && $mod_params->get('cat_hide_1_level','0')==1 && $parent_cat->parent_id==0 ? JTEXT::_('MOD_DJCLASSIFIEDS_SEARCH_CATEGORY_LABEL') : JText::sprintf((!empty($parent_cat->header_text) ? $parent_cat->header_text : 'MOD_DJCLASSIFIEDS_SEARCH_CATEGORY_SELECTOR_EMPTY_VALUE'), JText::_($parent_cat->name)),
'attr' => '',
'params' => $mod_params
));
}
}
$app->close();
}
function getSearchTags(){ // backward compatibility (for MooComplete)
$db = JFactory::getDBO();
$app = JFactory::getApplication();
$source = $app->input->get('source','items,categories,regions');
$res = array();
if(strstr($source, 'categories')){
$query = "SELECT a.* FROM (SELECT c.name, cp.name as cp_name FROM #__djcf_categories c
LEFT JOIN #__djcf_categories cp ON cp.id=c.parent_id
WHERE c.published!=0
) a GROUP BY a.name ORDER BY a.name";
$db->setQuery($query);
$cats =$db->loadObjectList();
$res = array();
foreach($cats as $cat){
//$res[] = $cat->name.' > '.JTExt::_('COM_DJCLASSIFIEDS_IN_CATEGORY').' '.$cat->cp_name;
if($cat->cp_name){
$res[] = $cat->name.' > '.$cat->cp_name;
}else{
$res[] = $cat->name;
}
}
}
if(strstr($source, 'items')){
$date_now = JFactory::getDate()->toSQL();
$query = "SELECT i.*, c.id as c_id, c.name AS c_name, c.alias AS c_alias, r.id as r_id, r.name as r_name, r.alias as r_alias "
."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 "
."WHERE i.date_exp > '".$date_now."' AND i.published=1 AND c.published!=0 ORDER BY i.name LIMIT 1000";
$db->setQuery($query);
$items =$db->loadObjectList();
foreach($items as $item){
//$res[] = $item->name.' > '.JTExt::_('COM_DJCLASSIFIEDS_IN_CATEGORY').' '.$item->c_name.' > '.$item->r_name;
$res[] = $item->name.' > '.$item->c_name.' > '.$item->r_name;
}
}
if(strstr($source, 'regions')){
$query = "SELECT a.* FROM (SELECT r.name, rp.name as rp_name FROM #__djcf_regions r
LEFT JOIN #__djcf_regions rp ON rp.id=r.parent_id
WHERE r.published=1
) a GROUP BY a.name ORDER BY a.name";
$db->setQuery($query);
$regs =$db->loadObjectList();
foreach($regs as $reg){
if($reg->rp_name){
$res[] = $reg->name.' > '.$reg->rp_name;
}else{
$res[] = $reg->name;
}
}
}
echo json_encode($res);
die('');
}
function getSearchAutocomplete()
{
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$source = $app->input->get('source','items,categories,regions');
$term = $app->input->getStr('term');
$res = array();
if(strstr($source, 'categories')){
$query = "SELECT a.* "
."FROM (SELECT c.id c_id, c.name, cp.id cp_id, cp.name as cp_name "
."FROM #__djcf_categories c "
."LEFT JOIN #__djcf_categories cp ON cp.id=c.parent_id "
."WHERE c.published!=0 AND c.name LIKE ".$db->q('%'.$term.'%').") a "
."GROUP BY a.name "
."ORDER BY a.name";
$db->setQuery($query);
$cats = $db->loadObjectList();
foreach($cats as $cat){
//$res[] = $cat->cp_name ? $cat->name.' > '.$cat->cp_name : $cat->name;
$res[] = JText::_($cat->name);
}
}
if(strstr($source, 'items')){
$date_now = JFactory::getDate()->toSQL();
$query = "SELECT i.*, c.id as c_id, c.name AS c_name, c.alias AS c_alias, r.id as r_id, r.name as r_name, r.alias as r_alias "
."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 "
."WHERE i.date_exp > '".$date_now."' AND i.published=1 AND c.published!=0 AND i.name LIKE ".$db->q('%'.$term.'%')." "
."ORDER BY i.name LIMIT 1000";
$db->setQuery($query);
$items = $db->loadObjectList();
foreach($items as $item){
//$res[] = $item->name.' ('.JTExt::_('COM_DJCLASSIFIEDS_IN_CATEGORY').' '.$item->c_name.')';
$res[] = $item->name;
}
}
if(strstr($source, 'regions')){
$query = "SELECT a.* "
."FROM (SELECT r.id r_id, r.name, rp.id rp_id, rp.name as rp_name "
."FROM #__djcf_regions r "
."LEFT JOIN #__djcf_regions rp ON rp.id=r.parent_id "
."WHERE r.published=1 AND r.name LIKE ".$db->q('%'.$term.'%').") a "
."GROUP BY a.name "
."ORDER BY a.name";
$db->setQuery($query);
$regs = $db->loadObjectList();
foreach($regs as $reg){
//$res[] = $reg->rp_name ? $reg->name.' > '.$reg->rp_name : $reg->name;
$res[] = JText::_($reg->name);
}
}
echo json_encode($res);
$app->close();
}
function changeItemFavourite()
{
header("Content-type: text/html; charset=utf-8");
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$user = JFactory::getUser();
$par = $app->getParams('com_djclassifieds');
$item_id = $app->input->getInt('item_id', 0);
if($user->id){
$query = "SELECT COUNT(id) FROM #__djcf_favourites WHERE item_id=".$item_id." AND user_id=".$user->id;
$db->setQuery($query);
$user_fav = $db->loadResult();
if($user_fav==0){
$query = "INSERT INTO #__djcf_favourites (`item_id`, `user_id`) VALUES (".$item_id.", ".$user->id.")";
}else{
$query = "DELETE FROM #__djcf_favourites WHERE item_id=".$item_id." AND user_id=".$user->id;
}
$db->setQuery($query);
$db->execute();
echo DJClassifiedsTheme::renderLayout('favbox', array('item_id' => $item_id, 'fav' => !$user_fav, 'par' => $par));
}
$app->close();
}
public function getCountryISO()
{
header("Content-type: text/html; charset=utf-8");
$app = JFactory::getApplication();
$id = $app->input->getInt('reg_id', 0);
if($id){
$regs = DJClassifiedsRegion::getParentPath($id);
foreach($regs as $reg){
if($reg->country_iso){
echo $reg->country_iso;
break;
}
}
}
$app->close();
}
public function getAskFields()
{
header("Content-type: text/html; charset=utf-8");
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$user = JFactory::getUser();
$query = $db->getQuery(true);
$query->select(array('f.*'))
->from('#__djcf_fields f')
->where('f.source = 3')
->where('f.published = 1')
->where('f.edition_blocked = 0')
->order('f.ordering');
$app->triggerEvent('onDJClassifiedsGetFormFieldsQuery', array(&$query, 'item'));
$db->setQuery($query);
$fields_list = $db->loadObjectList();
foreach($fields_list as $f){
if(!DJClassifiedsAccess::hasAccessToFormField($f)){
continue;
}
DJClassifiedsField::setFieldDefaultValue($f, $user->id);
echo DJClassifiedsField::renderFormField($f, 0, $app->getUserState('djcf.askform.data'));
}
$app->close();
}
}