Несколько недель ломаю голову над одним вопросом, уже весь мозг себе вынес - результата нет. Поэтому прошу
помощи . Вопрос по компоненту DJClassifieds. Данный компонент очень хорошо подходит как доска объявлений
для Joomla. Но в нем нет такого понятия как 'регион'(территориальный регион) (чтобы сделать объявления с привязкой к региону) - например
Цель - разместить разкрывающийся список (например в виде SHOW) - и по выбору из этого списка производить показ оюъявлений
Рязанская область, Пензенская область и т.д.
Решил это сделать. Что смог сделать:
1. Создал таблицу - _djcf_region - справочник регионов c полями region_id, region_name
для примера :
1 - Рязанская область
2 - Пензенская область
2. Добавил поле region_id в таблицу объявлений (_djcf_items)
Далее на примере вида show - МНЕ НУЖНО ПОНЯТЬ ПРИНЦИП РЕШЕНИЯ ПРОБЛЕМЫ!
В модель models\show.php добавляем функцию выборки списка регионов из справочника регионов:
class DjclassifiedsModelShow extends JModel
{
.........................
function getRegiones() {
$db= &JFactory::getDBO();
$query = "SELECT region_id as value,region_name as text FROM #__djcf_region order by text ";
$db->setQuery($query);
$regiones=$db->loadObjectList();
return $regiones;
}
...................................
}
т.е. список выбрали
Далее в com_djclassifieds\views\show\view.html.php добавляем формирование раскрывающегося этих регионов
//читаем параметр rid (это код региона региона)
$filter_regid = JRequest::getVar( 'rid',0,'default','int' ); - читаем параметр rid ('это код региона регион)
// это реакция на выбор из списка регионов в форме
$javascript = 'onchange="document.djclassifiedsForm.submit();"';
// Формируем элементы списка
$regionlist = array();
$regionlist=$model->getRegiones();
$regions=array();
// Задаем начальный элемент
$regions[]=JHTML::_('select.option', '0', "Все регионы", 'value', 'text' );
$regions=array_merge($regions,$regionlist);
// Формируем список польностью
$lists['regions']= JHTML::_( 'select.genericlist',$regions,'rid',$javascript,'value','text',$filter_regid);
$this->assignref('lists', $lists);
Далее в com_djclassifieds\views\show\tmpl\default.php
выводим этот список
<form name="djclassifiedsForm" id="djclassifiedsForm" method="post" action="index.php">
<div> Тут будет регион
<?php
echo $this->lists['regions']; ?>
</div>
<!-это название компонента->
<input type="hidden" name="option" value="com_djclassifieds" />
<!-это название вида ->
<input type="hidden" name="view" value="show" />
<!-это для пагинации -> -
<input type="hidden" name="limitstart" value="0" />
<!-это читаем и сохряняем текущую категорию ->
<input type="hidden" name="cid" value="<?php echo JRequest::getVar('cid','0'); ?>" />
<!-это читаем и сохряняем значение Itemid ->
<input type="hidden" name="Itemid" value="<?php echo JRequest::getVar('Itemid','0'); ?>" />
</form>
Все это работает - раскрывающийся список в виде SHOW выводиться, тут вопросов нет...
... идем далее
Теперь нам нужно, чтобы объявления выводились с учетом выбранного из списка региона - т.е. модифицируем выборку объявлений
добавив туда еще и критерий региона (значение фильтра для региона)
В моделe models\show.php за эту выборку отвечает function getElements($id)
измененная мною function getElements($id) приведена ниже - изменения указаны в комментарии
function getElements($id){
global $mainframe;
$list = implode(",", $id);
$par =& $mainframe->getParams('com_djclassifieds');
$limit = JRequest::getVar('limit', $par->get('limit_djitem_show'), '', 'int');
$limitstart = JRequest::getVar('limitstart', 0, '', 'int');
$search = '';
if(JRequest::getVar('search','0','string')!='0'){
$search = " AND i.name LIKE '%".JRequest::getVar('search','0','string')."%' ";
}
$reg_id='';
// проверяем значение rid и формируем еще одно дополнительное условие where для выборки
if(JRequest::getVar('rid','0','','int')>'0' && JRequest::getVar('rid','0','','int')<'99999') {
$reg_id= " AND i.region_id = ".JRequest::getVar('rid','0','','int')." "; ?>
// -------------- сформировали -- оно в $reg_id;
<script type="text/javascript">
//alert("<?php echo $reg_id; ?>");
</script>
<?php
}
$db= &JFactory::getDBO();
$order = JRequest::getVar('order');
$ord="i.id DESC";
if($order=="date"){
$ord="i.date_start DESC, i.id DESC ";
}elseif($order=="display"){
$ord="i.display DESC ";
}elseif($order=="description"){
$ord="i.intro_desc ";
}elseif($order=="category"){
$ord="c.name ";
}elseif($order=="title"){
$ord="i.name ";
}
$date_time =& JFactory::getDate();
$date_all=$date_time->toMySQL();
$date = explode(' ',$date_all);
// вот тут подцепляем это дополнительное условие $reg_id
$query = "(SELECT i.*, c.name AS c_name FROM #__djcf_items i, #__djcf_categories c WHERE i.cat_id = c.id AND i.cat_id IN (".$list.") AND i.date_exp > '".$date[0]."' AND i.published = 1 ".$reg_id." ORDER BY i.special DESC, ".$ord.")";
$tab = $this->_getList($query, $limitstart, $limit);
return $tab;
На этом мои знания иссякли
Что работает - теперь значение кода региона передается в браузере через
ridЕсли в браузере набираем mysite/index.php?option=com_djclassifieds&view=show&cid=1&Itemid=16&
rid=1результат выводятся все объявления Рязанской области (для примера), раскрывающийся список принимает значение Рязанской области
Если в браузере набираем mysite/index.php?option=com_djclassifieds&view=show&cid=1&Itemid=16&
rid=2то выводятся все объявления Пензенской области, раскрывающийся список принимает значение Пензенской области
Все это радует
А теперь ПРОБЛЕМА
Как заставить браузер переходить на ссылку mysite/index.php?option=com_djclassifieds&view=show&cid=1&Itemid=16&rid=1
при выборе из списка региона №1
или на ссылку mysite/index.php?option=com_djclassifieds&view=show&cid=1&Itemid=16&rid=2 при выборе из списка региона №2
У меня при выборе любого элемента из списка осуществляется переход на мysite/index.php (логично, в форме же указано
index.php
))).
Хотя фильтр отрабатывает верно
Наверно нужно делать файл типа Route.php - чтоб праильно сформировать ссылку.... вот в этом у меня и затык..