Новости Joomla

0 Пользователей и 1 Гость просматривают эту тему.
  • 41 Ответов
  • 3055 Просмотров
*

DimkaJack

  • Осваиваюсь на форуме
  • 28
  • 0 / 0
Основу для компонента брал отсюда:  http://joomlablog.ru/dokumentatsiya/dlya-razrabotchika/sozdanie-komponenta-dlya-joomla-2-5/433-chast-16-dobavlyaem-filtry-i-uchimsya-sozdavat-svoi Во фронтенде после использования любого фильтра все отображается нормально, но не листаются страницы, остается на первой. Если фильтр сбросить все работает отлично. сайт на локалке. В чем может быть проблема?
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Основная проблема в том что сайт на локале, и мы не обладая телепатическими знаниями не видим ни код ни как все выглядит (
По этому и помочь вам пока не увидим код вряд ли получится!
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
Хотя бы уточните, что значит не листаются страницы? Не срабатывает или что?
*

DimkaJack

  • Осваиваюсь на форуме
  • 28
  • 0 / 0
Хотя бы уточните, что значит не листаются страницы? Не срабатывает или что?
Если я применяю любой фильтр, допустим использую поиск, отображаются результаты в несколько страниц. Так вот если перейти на вторую страницу, сайт обновляется но отображается первая страница. При этом если фильтры сбросить, все работает.
*

DimkaJack

  • Осваиваюсь на форуме
  • 28
  • 0 / 0
Основная проблема в том что сайт на локале, и мы не обладая телепатическими знаниями не видим ни код ни как все выглядит (
По этому и помочь вам пока не увидим код вряд ли получится!

Попробую,
Модель
Код
protected function getListQuery()
{
// Создаем новый query объект.
$db = JFactory::getDbo();
$query = $db->getQuery(true);

// Выбераем поля.
$query->select('h.id, h.first_name, h.price, h.state, h.ordering');

// Из таблицы avto.
$query->from('tbl AS h');
               
                // Из таблицы repair
                $query->select('c.repair AS repair_title');
$query->leftJoin('tbl_rep AS c ON c.id = h.rep');
               
                // Из таблицы estate_type
                $query->select('x.name AS estate_title');
$query->leftJoin('tbl_estate AS x ON x.id = h.estate');
               
               
               
                // Из таблицы district
                $query->select('d.distr AS distr_title');
$query->leftJoin('tbl_distr AS d ON d.id = h.distr');

// Фильтруем по состоянию.
$published = $this->getState('filter.type');

if (is_numeric($published))
{
$query->where('h.estate = ' . (int) $published);
}
elseif ($published === '')
{
$query->where('(h.estate = 1 OR h.estate = 2 OR h.estate = 3 OR h.estate = 4 OR h.estate = 5 OR h.estate = 6 OR h.estate = 7 OR h.estate = 9 OR h.estate = 10 OR h.estate = 21 OR h.estate = 22 OR h.estate = 23 OR h.estate = 24)');
}


                // Фильтруем по цене.
                $maxprice = $this->getState('filter.maxprice');
                $minprice = $this->getState('filter.minprice');

if (is_numeric($minprice))
{

$query->where('h.price >= ' . (int) $minprice);

}
               
                if (is_numeric($maxprice))
{


$query->where('h.price <= ' . (int) $maxprice);
}

// Фильтруем по поиску в тексте сообщения.
$search = $this->getState('filter.search');

if (!empty($search))
{
$search = $db->quote('%' . $db->escape($search, true). '%', false);
$query->where('h.first_name LIKE ' . $search);
}

// Добавляем сортировку.
$orderCol  = $this->state->get('list.ordering', 'h.id');
$orderDirn = $this->state->get('list.direction', 'desc');
$query->order($db->escape($orderCol . ' ' . $orderDirn));

return $query;
}

/**
* Метод для авто-заполнения состояния модели.
*
* Заметка. Вызов метода getState в этом методе приведет к рекурсии.
*
* @return  void
*/
protected function populateState($ordering = null, $direction = null)
{
// Получаем и устанавливаем значение фильтра состояния.
$published = $this->getUserStateFromRequest($this->context . '.filter.type', 'filter_type', '', 'string');
$this->setState('filter.type', $published);
                $session = JFactory::getSession();
                $session->set('filter.type', $published);
                             
// Получаем и устанавливаем значение фильтра поиска по тексту сообщения.
$search = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search');
$this->setState('filter.search', $search);           
                $session->set('filter.search', $search);
               
                // Получаем и устанавливаем значение фильтра поиска по цене.
$minprice = $this->getUserStateFromRequest($this->context . '.filter.minprice', 'filter_minprice');
$this->setState('filter.minprice', $minprice);
                $session->set('filter.minprice', $minprice);
               
                $maxprice = $this->getUserStateFromRequest($this->context . '.filter.maxprice', 'filter_maxprice');
$this->setState('filter.maxprice', $maxprice);
                $session->set('filter.maxprice', $maxprice);

parent::populateState('h.id', 'desc');
}

это из шаблона вида default_body.php
Код
// Данные по сортировке.
$listDirn = $this->escape($this->state->get('list.direction'));
$listOrder = $this->escape($this->state->get('list.ordering'));
$saveOrder = $listOrder == 'ordering';

foreach ($this->items as $i => $item) :
//$canEdit = JFactory::getUser()->authorise('core.edit', 'com_avto.message.' . $item->id);
//$canChange = JFactory::getUser()->authorise('core.edit.state', 'com_avto.message.' . $item->id);
?>
<tr class="row<?php //echo $i % 2; ?>">
<td>
<?php //echo JHtml::_('grid.id', $i, $item->id); ?>
</td>
<td width="100%">
                    <div class="ad_box">
<?php
                       
                            echo '<p><div><span>Имя:</span> '.$item->first_name.'</div><div><span>Ремонт:</span> '.$item->repair_title.'</div><div><span>Район:</span> '.$item->district_title.'</div><div><span>Тип:</span> '.$item->estate_type_title.'</div><div><span>Цена:</span> '.$item->price.'</div><div><a href="'.JRoute::_('index.php?option=com_avto&view=avto&id='.(int)$item->id).'">Подробнее...</a></div></p>';
                         ?>
                    </div>
</td>
<td class="center">
<?php //echo $this->escape($item->category_title); ?>
</td>
<td class="center">
<?php //echo JHtml::_('jgrid.published', $item->state, $i, 'avtos.', $canChange); ?>
</td>
<td class="order">
<?php if ($saveOrder) : ?>
<?php if ($listDirn == 'asc') : ?>
<span><?php echo $this->pagination->orderUpIcon($i, true, 'avtos.orderup', 'JLIB_HTML_MOVE_UP', $saveOrder); ?></span>
<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, true, 'avtos.orderdown', 'JLIB_HTML_MOVE_DOWN', $saveOrder); ?></span>
<?php elseif ($listDirn == 'desc') : ?>
<span><?php echo $this->pagination->orderUpIcon($i, true, 'avtos.orderdown', 'JLIB_HTML_MOVE_UP', $saveOrder); ?></span>
<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, true, 'avtos.orderup', 'JLIB_HTML_MOVE_DOWN', $saveOrder); ?></span>
<?php endif; ?>
<?php endif; ?>
<?php $disabled = $saveOrder ?  '' : 'disabled="disabled"'; ?>
<!--<input type="text" name="order[]" size="5" value="<?php //echo $item->ordering; ?>" <?php //echo $disabled; ?> class="text-area-order" />-->
</td>
<td>
<?php //echo $item->id; ?>
</td>
</tr>
<?php endforeach; ?>

И фильтры я попытался вынести в отдельный модуль, вот код шаблона
Код
<?php
// Запрет прямого доступа.
defined('_JEXEC') or die;

// Загружаем тултипы.
JHtml::_('behavior.tooltip');

$options = array();
 
        //$options[] = JHtml::_('select.checkbox', '0', 'Выберите район');
        //JHTML::_( 'input.checkbox', $name, $label, $value );
        $options[] = JHtml::_('select.option', '1', 'Комната');
        $options[] = JHtml::_('select.option', '2', '1-ком квартира');
        $options[] = JHtml::_('select.option', '3', '2-ком квартира');
        $options[] = JHtml::_('select.option', '4', '3-ком квартира');
        $options[] = JHtml::_('select.option', '5', '4-ком и более квартира');
        $options[] = JHtml::_('select.option', '6', 'Гостинка');
        $options[] = JHtml::_('select.option', '7', 'Малосемейка');
        $options[] = JHtml::_('select.option', '9', 'Коммуналка');
        $options[] = JHtml::_('select.option', '10', 'Общежитие');
        $options[] = JHtml::_('select.option', '21', 'Частный дом');
        $options[] = JHtml::_('select.option', '22', 'часть дома');
        $options[] = JHtml::_('select.option', '23', 'Койко-место');
        $options[] = JHtml::_('select.option', '24', 'Не определено');

?>
<form action="<?php echo JRoute::_('index.php?option=com_avto'); ?>" method="post" name="adminForm" id="adminForm">
<fieldset id="filter-bar">
<div class="filter-search fltlft">
                    <label class="filter-search-lbl" for="filter_search"><span><?php echo JText::_('Поиск:'); ?></span></label>
                    <input type="text" name="filter_search" id="filter_search" value="<?php $session = JFactory::getSession(); echo $session->get('filter.search'); ?>" title="<?php echo JText::_('COM_AVTO_FILTER_SEARCH_DESC'); ?>" />
<button type="submit" class="uk-button uk-button-primary"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
<button type="button" class="uk-button uk-button-primary" onclick="document.id('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
</div>
           
                <div class="filter-pricef fltlft">
                    <label class="filter-pricef-lbl" for="filter_maxprice"><span><?php echo JText::_('Фильтр по цене:'); ?></span></label>
                        <label><?php echo JText::_('От'); ?></label>
<input type="text" name="filter_minprice" id="filter_minprice" value="<?php $session = JFactory::getSession(); echo $session->get('filter.minprice'); ?>" title="<?php echo JText::_('COM_AVTO_FILTER_MIN_PRICE_DESC'); ?>" />
                        <label><?php echo JText::_('- До'); ?></label>
                        <input type="text" name="filter_maxprice" id="filter_maxprice" value="<?php $session = JFactory::getSession(); echo $session->get('filter.maxprice'); ?>" title="<?php echo JText::_('COM_AVTO_FILTER_MAX_PRICE_DESC'); ?>" />                       
<button type="submit" class="uk-button uk-button-primary"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
<button type="button" class="uk-button uk-button-primary" onclick="document.id('filter_minprice').value=''; document.id('filter_maxprice').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
</div>
           
<div class="filter-select fltrt">
<select name="filter_type" class="inputbox" onchange="this.form.submit()">
<option value=""><?php echo JText::_('Фильтр');?></option>
                                <?php
                                echo JHtml::_('select.options', $options, 'value', 'text', $session->get('filter.type'), true);
                                ?>
</select>                     
</div>
</fieldset>
<div class="clr"> </div>
<table class="adminlist">
<thead><?php// echo $this->loadTemplate('head');?></thead>
<tbody><?php// echo $this->loadTemplate('body');?></tbody>
<tfoot><?php// echo $this->loadTemplate('foot');?></tfoot>
</table>
<div>
<input type="hidden" name="task" value="" />
<input type="hidden" name="boxchecked" value="0" />
<input type="hidden" name="filter_order" value="<?php //echo $this->escape($this->state->get('list.ordering')); ?>" />
<input type="hidden" name="filter_order_Dir" value="<?php// echo $this->escape($this->state->get('list.direction')); ?>" />
<?php echo JHtml::_('form.token'); ?>
</div>
</form>

И да я новичек, поэтому извините если что)))
« Последнее редактирование: 31.03.2014, 13:01:20 от DimkaJack »
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
Хмм, возможно дело в кэше модели. У Вас реализован метод getStoreId()?

И просто интересно, почему используете $session для значений фильтров?
*

DimkaJack

  • Осваиваюсь на форуме
  • 28
  • 0 / 0
Хмм, возможно дело в кэше модели. У Вас реализован метод getStoreId()?

И просто интересно, почему используете $session для значений фильтров?

getStoreId не реализован, видимо я его вырезал. Не совсем ясно его назначение, если не сложно можно в двух словах объяснить. Через сессии передаю значения фильтров из компонента в модуль и обратно, возможно это неправильный подход, но я не знаю как иначе вытаскивать данные из компонента.
*

DimkaJack

  • Осваиваюсь на форуме
  • 28
  • 0 / 0
Хмм, возможно дело в кэше модели. У Вас реализован метод getStoreId()?

И просто интересно, почему используете $session для значений фильтров?
Прописал
Код
protected function getStoreId($id = '')
{
// Компилируем store id.
$id .= ':' . $this->getState('filter.search');
$id .= ':' . $this->getState('filter.state');


return parent::getStoreId($id);
}

ситуация не изменилась.
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
*

DimkaJack

  • Осваиваюсь на форуме
  • 28
  • 0 / 0
В первом посте есть ссылка, там все это описано.
почитал(огромное спасибо за этот цикл статей), использовал, безрезультатно. Пожалуй переформулирую вопрос - Как правильно вынести фильтры в отдельный модуль? И имеет ли смысл создавать новую тему?
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
Дело не в модуле - у Вас при использовании фильтров модель застревает на определенной выборке. Пробуйте понять, в чем дело. Сделайте echo $query, посмотрите, какой запрос. Если запрос строится правильно, значит проблема скорее всего не в модели.

Посмотрите стандартные компоненты Joomla, как там это реализовано.
*

DimkaJack

  • Осваиваюсь на форуме
  • 28
  • 0 / 0
Дело не в модуле - у Вас при использовании фильтров модель застревает на определенной выборке. Пробуйте понять, в чем дело. Сделайте echo $query, посмотрите, какой запрос. Если запрос строится правильно, значит проблема скорее всего не в модели.

Посмотрите стандартные компоненты Joomla, как там это реализовано.
Кажется нашел зацепку, при нажатии на любую кнопку пагинации, список отображается с конца: т.е. Отображаются записи по id в обратном порядке, query вывел: ORDER BY h.id desc. Хотя сортировку я не менял, запутался уже.
« Последнее редактирование: 01.04.2014, 10:33:27 от DimkaJack »
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
Может из-за того, что закоментированы эти строки?

Код: php
<input type="hidden" name="filter_order" value="<?php //echo $this->escape($this->state->get('list.ordering')); ?>" />
<input type="hidden" name="filter_order_Dir" value="<?php// echo $this->escape($this->state->get('list.direction')); ?>" />

ORDER BY h.id desc - у Вас так установлено в модели.
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
И еще в запросе учитывается LIMIT? При переходе по страницам LIMIT должен меняться.
*

DimkaJack

  • Осваиваюсь на форуме
  • 28
  • 0 / 0

дело в том что из модуля использовать this не получается, пробовал использовать сессию - то же самое,. Хотя по идее в шаблоне отображения это не закомментировано и должно работать.  Интересно что при использовании пагинации - в адресной строке  отображается правильный адрес, тоесть да Limit start прописывается правильно. ЧПУ пробовал отключать не помогает
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
Я не совсем понял, что еще за модуль такой? Вы сделайте сначал как правильно, добейтесь того, чтобы все работало.
*

DimkaJack

  • Осваиваюсь на форуме
  • 28
  • 0 / 0
Я не совсем понял, что еще за модуль такой? Вы сделайте сначал как правильно, добейтесь того, чтобы все работало.

психанул, банально перенес все из admin части в site. закомментировал добавление бара. и как итог все равно ничего не работает... Это запредельность кривизны моих рук или я чего то недоглядел. К слову, в админке все работает отлично
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
Цитировать
Это запредельность кривизны моих рук или я чего то недоглядел.
Ну тут уж неизвестно... Вообще не знаю, что еще подсказать =( Если хотите, можете выслать мне код всего компонента на b2z () joomlablog.ru, но не обещаю, что посмотрю сразу же. Возможно до конца недели.
*

DimkaJack

  • Осваиваюсь на форуме
  • 28
  • 0 / 0
Ну тут уж неизвестно... Вообще не знаю, что еще подсказать =( Если хотите, можете выслать мне код всего компонента на b2z () joomlablog.ru, но не обещаю, что посмотрю сразу же. Возможно до конца недели.
Дело в том, что я использовал Ваш компонент из 16 части, перенес файлы из бэкенда во фронтэнд и там не работает пагинация. можете проверить. исходники у Вас наверняка есть))
*

DimkaJack

  • Осваиваюсь на форуме
  • 28
  • 0 / 0
Нашел еще несколько подобных случаев на англоязычных форумах, все без ответа...
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
Дело в том, что я использовал Ваш компонент из 16 части, перенес файлы из бэкенда во фронтэнд и там не работает пагинация. можете проверить. исходники у Вас наверняка есть))
ок, будет время - проверю.
*

DimkaJack

  • Осваиваюсь на форуме
  • 28
  • 0 / 0
ок, будет время - проверю.
Был бы Вам очень признателен))
*

DimkaJack

  • Осваиваюсь на форуме
  • 28
  • 0 / 0
Набрел в интернете на следующее: "The page links generated by the Joomla! pagination block we use in the front-end use simple links to refresh the page (unlike the back-end pagination which uses JavaScript). These links pass a start variable - but cannot include the post variables from the form "
Если я правильно понял, то нужно писать дополнительно JavaScript для пагинации... Вот ссылка http://chronoengine.com/forums/posts/f12/t20616.html?page=1 но там обсуждают определенный продукт, переделать под свои нужды не хватает опыта. В правильном ли направлении я копаю?
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
Точно, как же я про это забыл. Попробуйте добавить в метод populateState следующие строки:

Код: php
$app = JFactory::getApplication();

$value = $app->input->get('limit', $app->getCfg('list_limit', 0), 'uint');
$this->setState('list.limit', $value);

$value = $app->input->get('limitstart', 0, 'uint');
$this->setState('list.start', $value);
*

DimkaJack

  • Осваиваюсь на форуме
  • 28
  • 0 / 0
Точно, как же я про это забыл. Попробуйте добавить в метод populateState следующие строки:

Код: php
$app = JFactory::getApplication();

$value = $app->input->get('limit', $app->getCfg('list_limit', 0), 'uint');
$this->setState('list.limit', $value);

$value = $app->input->get('limitstart', 0, 'uint');
$this->setState('list.start', $value);

Да! Спасибо огромное!! Все заработало, без Вас бы не разобрался...
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
Да уж, давно я не практиковался - вылетел из головы этот момент! Надо будет учесть, когда буду делать документацию по созданию компонента для Joomla 3.
*

DimkaJack

  • Осваиваюсь на форуме
  • 28
  • 0 / 0
Да уж, давно я не практиковался - вылетел из головы этот момент! Надо будет учесть, когда буду делать документацию по созданию компонента для Joomla 3.

Даже не знаю как сказать, но ничего не работает((( я видимо не там смотрел. Вы проверяли у себя?
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
Даже не знаю как сказать, но ничего не работает((( я видимо не там смотрел. Вы проверяли у себя?
Нет, не было времени.
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
*

DimkaJack

  • Осваиваюсь на форуме
  • 28
  • 0 / 0
Блин, сорри - забыл посмотреть. очень постараюсь на этой неделе.
Ну тут лучше поздно, чем никогда))
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Вывод таблицы, деление на страницы

Автор March Cat

Ответов: 6
Просмотров: 844
Последний ответ 09.01.2019, 18:49:15
от dmitry_stas
Проблема с модулем после переноса с локалки на хостинг

Автор master-smeta

Ответов: 8
Просмотров: 2280
Последний ответ 15.11.2018, 16:34:46
от master-smeta
Меню схлопывается после перезагрузки страницы

Автор onelawyer

Ответов: 10
Просмотров: 1264
Последний ответ 11.10.2017, 14:50:48
от effrit
Как вставить модуль в код нужной страницы php?

Автор zvi

Ответов: 7
Просмотров: 3432
Последний ответ 12.04.2016, 19:36:55
от AlekVolsk
Модуль. Сообщение о включенном AdBlock. Как отпустить Javascript в низ страницы?

Автор cartgen

Ответов: 2
Просмотров: 1540
Последний ответ 19.08.2015, 23:42:16
от palexa