Spade
Mini Shell
| Directory:~$ /home/lmsyaran/www/components/com_jea/models/ |
| [Home] [System Details] [Kill Me] |
<?php
/**
* This file is part of Joomla Estate Agency - Joomla! extension for real
estate agency
*
* @package Joomla.Site
* @subpackage com_jea
* @copyright Copyright (C) 2008 - 2020 PHILIP Sylvain. All rights
reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('_JEXEC') or die;
use Joomla\Utilities\ArrayHelper;
/**
* Properties model class.
*
* @package Joomla.Site
* @subpackage com_jea
*
* @see JModelList
*
* @since 2.0
*/
class JeaModelProperties extends JModelList
{
/**
* Model context string.
*
* @var string
*/
protected $context = 'com_jea.properties';
/**
* Filters and their default values used in the query
*
* @var array
*/
protected $filters = array(
'search' => '',
'transaction_type' => '',
'type_id' => 0,
'department_id' => 0,
'town_id' => 0,
'area_id' => 0,
'zip_codes' => '',
'budget_min' => 0,
'budget_max' => 0,
'living_space_min' => 0,
'living_space_max' => 0,
'land_space_min' => 0,
'land_space_max' => 0,
'rooms_min' => 0,
'bedrooms_min' => 0,
'bathrooms_min' => 0,
'floor' => '',
'hotwatertype' => 0,
'heatingtype' => 0,
'condition' => 0,
'orientation' => 0,
'amenities' => array()
);
/**
* Constructor.
*
* @param array $config An optional associative array of configuration
settings.
*
* @see JModelList
*/
public function __construct($config = array())
{
if (empty($config['filter_fields']))
{
// This fields concern the ordering
$config['filter_fields'] = array(
'p.id',
'p.price',
'p.created',
'p.ordering',
'p.living_space',
'p.land_space',
'p.hits',
'p.ref',
'type',
'departement',
'town',
'area'
);
}
// Add a context by Itemid
$itemId =
JFactory::getApplication()->input->getInt('Itemid', 0);
if ($itemId > 0)
{
$this->context .= '.menuitem' . $itemId;
}
parent::__construct($config);
}
/**
* Overrides parent method
*
* @param string $ordering An optional ordering field.
* @param string $direction An optional direction (asc|desc).
*
* @return void
*
* @see JModelList::populateState()
*/
protected function populateState($ordering = null, $direction = null)
{
$app = JFactory::getApplication('site');
// Load the parameters.
$params = $app->getParams();
$this->setState('params', $params);
$searchContext = false;
foreach ($this->filters as $name => $defaultValue)
{
$state = $this->getUserStateFromRequest($this->context .
'.filter.' . $name, 'filter_' . $name, $defaultValue,
'none', false);
if (! $searchContext && ! empty($state))
{
/*
This flag indiquate that some filters are set by an user, so the
context is a search.
* It will be usefull in the view to retrieve this flag.
*/
$searchContext = true;
}
else
{
// Get component menuitem parameters
$state2 = $params->get('filter_' . $name, $defaultValue);
if (! empty($state2))
{
$state = $state2;
}
}
// If the state is an array, check if it not contains only a zero value
if (is_array($state) && in_array(0, $state))
{
$key = array_search(0, $state);
unset($state[$key]);
}
$this->setState('filter.' . $name, $state);
}
$this->setState('filter.language',
$app->getLanguageFilter());
$this->setState('searchcontext', $searchContext);
// List state information
$limit = $this->getUserStateFromRequest($this->context .
'.filter.limit', 'limit',
$params->get('list_limit', 10), 'uint');
$this->setState('list.limit', $limit);
$orderCol = $app->getUserStateFromRequest($this->context .
'.ordercol', 'filter_order', $ordering);
if ($orderCol)
{
$this->setState('list.ordering', $orderCol);
}
$orderDirn = $app->getUserStateFromRequest($this->context .
'.orderdirn', 'filter_order_Dir', $direction);
if ($orderDirn)
{
$this->setState('list.direction', $orderDirn);
}
$value = $app->input->get('limitstart', 0,
'uint');
$limitstart = ($limit != 0 ? (floor($value / $limit) * $limit) : 0);
$this->setState('list.start', $limitstart);
}
/**
* Return the model filters
*
* @return array
*/
public function getFilters()
{
return $this->filters;
}
/**
* Overrides parent method
*
* @return JDatabaseQuery A JDatabaseQuery object to retrieve the data
set.
*
* @see JModelList::getListQuery()
*/
protected function getListQuery()
{
$dispatcher = JDispatcher::getInstance();
// Include the jea plugins for the onBeforeSearchQuery event.
JPluginHelper::importPlugin('jea');
// Create a new query object.
$db = $this->getDbo();
$query = $db->getQuery(true);
$query->select('p.*');
$query->from('#__jea_properties AS p');
// Join properties types
$query->select('t.value AS `type`');
$query->join('LEFT', '#__jea_types AS t ON t.id =
p.type_id');
// Join departments
$query->select('d.value AS department');
$query->join('LEFT', '#__jea_departments AS d ON d.id =
p.department_id');
// Join towns
$query->select('town.value AS town');
$query->join('LEFT', '#__jea_towns AS town ON town.id =
p.town_id');
// Join areas
$query->select('area.value AS area');
$query->join('LEFT', '#__jea_areas AS area ON area.id =
p.area_id');
// Join conditions
$query->select('c.value AS `condition`');
$query->join('LEFT', '#__jea_conditions AS c ON c.id =
p.condition_id');
// Join users
$query->select('u.username AS author');
$query->join('LEFT', '#__users AS u ON u.id =
p.created_by');
// Join slogans
$query->select('s.value AS slogan');
$query->join('LEFT', '#__jea_slogans AS s ON s.id =
p.slogan_id');
if ($this->getState('manage') == true)
{
$lang = $this->getUserStateFromRequest($this->context .
'.filter.language', 'filter_language', '');
if ($lang)
{
$query->where('p.language =' .
$db->Quote($db->escape($lang)));
}
$this->setState('filter.language', $lang);
$user = JFactory::getUser();
$canEdit = $user->authorise('core.edit',
'com_jea');
$canEditOwn = $user->authorise('core.edit.own',
'com_jea');
if (!$canEdit && $canEditOwn)
{
// Get only the user properties
$query->where('p.created_by =' . (int) $user->id);
}
if (!$canEditOwn)
{
throw new
\RuntimeException(JText::_('JERROR_ALERTNOAUTHOR'));
}
}
else
{
if ($this->getState('filter.language'))
{
$query->where('p.language in (' .
$db->quote(JFactory::getLanguage()->getTag()) . ',' .
$db->quote('*') . ')');
}
$query->where('p.published=1');
// Filter by access level
$user = JFactory::getUser();
$groups = implode(',', $user->getAuthorisedViewLevels());
$query->where('p.access IN (' . $groups . ')');
// Filter by start and end dates.
$nullDate = $db->Quote($db->getNullDate());
$nowDate = $db->Quote(JFactory::getDate()->toSql());
$query->where('(p.publish_up = ' . $nullDate . ' OR
p.publish_up <= ' . $nowDate . ')');
$query->where('(p.publish_down = ' . $nullDate . ' OR
p.publish_down >= ' . $nowDate . ')');
}
// Filter by search
if ($value = $this->getState('filter.search'))
{
$value = $db->Quote('%' . $db->escape($value, true) .
'%');
$search = '(p.ref LIKE ' . $value . ' OR p.title LIKE
' . $value . ')';
$query->where($search);
}
// Filter by transaction type
if ($value = $this->getState('filter.transaction_type'))
{
$query->where('p.transaction_type =' .
$db->Quote($db->escape($value)));
}
// Filter by property type
if ($value = $this->getState('filter.type_id'))
{
if (is_array($value))
{
$value = ArrayHelper::toInteger($value);
$query->where('p.type_id IN(' . implode(',',
$value) . ')');
}
else
{
$query->where('p.type_id =' . (int) $value);
}
}
// Filter by departments
if ($value = $this->getState('filter.department_id'))
{
$query->where('p.department_id =' . (int) $value);
}
// Filter by town
if ($value = $this->getState('filter.town_id'))
{
$query->where('p.town_id =' . (int) $value);
}
// Filter by area
if ($value = $this->getState('filter.area_id'))
{
$query->where('p.area_id =' . (int) $value);
}
// Filter by zip codes
if ($value = $this->getState('filter.zip_codes'))
{
$zip_codes = explode(',', $value);
foreach ($zip_codes as &$v)
{
$v = $db->Quote($db->escape(trim($v)));
}
$query->where('p.zip_code IN(' . implode(',',
$zip_codes) . ')');
}
// Filter by budget min
if ($value = $this->getState('filter.budget_min'))
{
$query->where('p.price >=' . (int) $value);
}
// Filter by budget max
if ($value = $this->getState('filter.budget_max'))
{
$query->where('p.price <=' . (int) $value);
}
// Filter by living space min
if ($value = $this->getState('filter.living_space_min'))
{
$query->where('p.living_space >=' . (int) $value);
}
// Filter by living space max
if ($value = $this->getState('filter.living_space_max'))
{
$query->where('p.living_space <=' . (int) $value);
}
// Filter by land space min
if ($value = $this->getState('filter.land_space_min'))
{
$query->where('p.land_space >=' . (int) $value);
}
// Filter by land space max
if ($value = $this->getState('filter.land_space_max'))
{
$query->where('p.land_space <=' . (int) $value);
}
// Filter by rooms min
if ($value = $this->getState('filter.rooms_min'))
{
$query->where('p.rooms >=' . (int) $value);
}
// Filter by bedrooms
if ($value = $this->getState('filter.bedrooms_min'))
{
$query->where('p.bedrooms >=' . (int) $value);
}
// Filter by bathrooms
if ($value = $this->getState('filter.bathrooms_min'))
{
$query->where('p.bathrooms >=' . (int) $value);
}
// Filter by floor
// 0 is a valid value as it corresponds to ground floor
if ($value = $this->getState('filter.floor') !=
'')
{
$query->where('p.floor =' . (int) $value);
}
// Filter by hot water type
if ($value = $this->getState('filter.hotwatertype'))
{
$query->where('p.hot_water_type =' . (int) $value);
}
// Filter by heating type condition
if ($value = $this->getState('filter.heatingtype'))
{
$query->where('p.heating_type =' . (int) $value);
}
// Filter by condition
if ($value = $this->getState('filter.condition'))
{
$query->where('p.condition_id =' . (int) $value);
}
// Filter by orientation
if ($value = $this->getState('filter.orientation'))
{
$query->where('p.orientation =' .
$db->Quote($db->escape($value)));
}
// Filter by amenities
if ($value = $this->getState('filter.amenities'))
{
$amenities = ArrayHelper::toInteger((array) $value);
foreach ($amenities as $id)
{
if ($id > 0)
{
$query->where("p.amenities LIKE '%-{$id}-%'");
}
}
}
// Add the list ordering clause.
$params = $this->state->get('params');
if ($params != null)
{
$orderCol = $this->state->get('list.ordering',
$params->get('orderby', 'p.id'));
$orderDirn = $this->state->get('list.direction',
$params->get('orderby_direction', 'DESC'));
}
else
{
$orderCol = $this->state->get('list.ordering',
'p.id');
$orderDirn = $this->state->get('list.direction',
'DESC');
}
$query->order($db->escape($orderCol . ' ' . $orderDirn));
$dispatcher->trigger('onBeforeSearch', array(&$query,
&$this->state));
return $query;
}
/**
* Retrieve the list of items which can be managed
*
* @return multitype:array|boolean
*/
public function getMyItems()
{
$this->setState('manage', true);
return $this->getItems();
}
/**
* Return the min max values for a column
*
* @param string $fieldName The column name
* @param string $transaction_type Optional transaction type to filter
on
*
* @return integer[]
*/
public function getFieldLimit($fieldName = '', $transaction_type
= '')
{
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$col = '`' . $db->escape($fieldName) . '`';
$query->select("MIN($col) AS min_value, MAX($col) AS
max_value");
$query->from('#__jea_properties');
if ($transaction_type)
{
$query->where('transaction_type =' .
$db->Quote($db->escape($transaction_type)));
}
$db->setQuery($query);
$row = $db->loadObject();
if (empty($row))
{
return array(0, 0);
}
return array((int) $row->min_value, (int) $row->max_value);
}
}