Табы с сортируемыми таблицами (сделать не зависимыми[ajax])

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Аватара пользователя
Altenrion
Сообщения: 44
Зарегистрирован: 2013.03.18, 12:05
Контактная информация:

Табы с сортируемыми таблицами (сделать не зависимыми[ajax])

Сообщение Altenrion »

Доброго времени суток, Не пинайте сильно, хочу получить консультацию и советы, а не тумаки ^^.

Проблема заключается в следующем. В админке необходимо сделать страницу, в которой будут несколько таблиц с сортировками, и пагинацией. Каждая такая таблица должна быть на отдельной закладке( Tab' е).

Пока таблицы вынес в отдельные представления :

Код: Выделить всё

<div class="grid no-border">
    <div class="grid-header">
        <i class="fa fa-table"></i>
        <span class="grid-title">Список представителей</span>
        <div class="pull-right grid-tools">
            <a data-widget="collapse" title="Collapse"><i class="fa fa-chevron-up"></i></a>
            <a data-widget="reload" title="Reload"><i class="fa fa-refresh"></i></a>
            <a data-widget="remove" title="Remove"><i class="fa fa-times"></i></a>
        </div>
    </div>
    <div class="grid-body">
        <div class="table-responsive">
            <table class="table table-striped">
                <thead>
                <tr>
                    <th><?= $sortm->link('id') ?></th>
                    <th><?= $sortm->link('F_NAME','Фамилия') ?></th>
                    <th><?= $sortm->link('L_NAME','Имя') ?></th>
                    <th><?= $sortm->link('S_NAME','Отчество') ?></th>
                    <th><?= $sortm->link('EMAIL','email') ?></th>
                    <th><?= $sortm->link('roles','Роль') ?></th>
                    <th>Управление</th>

                </tr>
                </thead>
                <tbody>
                <? foreach($manags as $model): ?>
                    <tr>
                        <td><?= $model->id  ?></td>
                        <td><?= $model->F_NAME  ?></td>
                        <td><?= $model->L_NAME  ?></td>
                        <td><?= $model->S_NAME  ?></td>
                        <td><?= $model->EMAIL  ?></td>
                        <td><?= $model->roles  ?></td>
                        <td>
                            <a href="#"><i class="fa fa-check bg-green action"></i></a>
                            <a href="#"><i class="fa fa-pencil bg-blue action"></i></a>
                            <a href="#"><i class="fa fa-crop bg-red action"></i></a>
                        </td>

                    </tr>
                <? endforeach; unset($model);?>
                </tbody>
            </table>

            <? $this->widget('LinkPager', array(
                'pages'=>$pags,
            )) ?>

        </div>
    </div>
</div>
Вызываю их следующим образом, в табах главной страницы :

Код: Выделить всё

 <? $this->renderPartial('_exp_grid',array('sort'=>$sort,'pages'=>$pages,'models'=>$models)); ?>
В контроллере пришлось сделать нечто не очень приемлемое но пока работающее, но явно только "пока" :

Код: Выделить всё

public function actionManageUsers()
    {

        $criteria_exp = new CDbCriteria();
        $criteria_exp->condition = "roles='Exp' OR roles='Exp1' OR roles='Exp2' OR roles='Exp3'";

        $count_exp = Users::model()->count($criteria_exp);
        $pages_exp = new CPagination($count_exp);
        $pages_exp->pageSize = 10;
        $pages_exp->applyLimit($criteria_exp);

        $sort_exp = new CSort();
        $sort_exp->attributes = array('id','F_NAME','L_NAME','S_NAME','EMAIL','roles');
        $sort_exp->applyOrder($criteria_exp);

        $experts = Users::model()->findAll($criteria_exp);



        $criteria_man = new CDbCriteria();
        $criteria_man->condition = "roles='Manager' ";

        $count_man = Users::model()->count($criteria_man);
        $pages_man = new CPagination($count_man);
        $pages_man->pageSize = 5;
        $pages_man->applyLimit($criteria_man);

        $sort_man = new CSort();
        $sort_man->attributes = array('id','F_NAME','L_NAME','S_NAME','EMAIL','roles');
        $sort_man->applyOrder($criteria_man);

        $managers = Users::model()->findAll($criteria_man);


        $this->render('manage_users', array(
            'manags'=>$managers,
            'pags'=>$pages_man,
            'sortm'=>$sort_man,

            'models'=>$experts,
            'pages'=>$pages_exp,
            'sort'=>$sort_exp,
        ));
 
Все отображается правильно без ошибок куда либо, но есть несколько проблем:
  • 1) пагинация не ajax, и следовательно при попытке перейти на 2 страницу 2-ой таблицы , главная страница перезагружается, и отображается первая закладка.
    2)когда запускается сортировка, она идет "в лоб" , и соответственно пересортирует все таблицы. Как от этого уйти не знаю, не реализовывал.
Так понимаю что ошибок не влезло пока , потому что поля у нескольких таблиц одинаковые. но следующая глобальная страница будет с разными таблицами.

Подскажите пожалуйста как правильно реализовать подобное ? с CGridView сам глубоко не копался, пробовал его использовать но не разобрался. Читал про использование CListView но не использовал.

Как можно реализовать задуманное ?
Вложения
скрин.png
скрин.png (45.51 КБ) 7941 просмотр
Аватара пользователя
Altenrion
Сообщения: 44
Зарегистрирован: 2013.03.18, 12:05
Контактная информация:

Re: Табы с сортируемыми таблицами (сделать не зависимыми[aja

Сообщение Altenrion »

Очень нужна помощь!
Последний раз редактировалось Altenrion 2014.09.16, 08:33, всего редактировалось 1 раз.
Аватара пользователя
Altenrion
Сообщения: 44
Зарегистрирован: 2013.03.18, 12:05
Контактная информация:

Re: Табы с сортируемыми таблицами (сделать не зависимыми[aja

Сообщение Altenrion »

Не поверю что тут не проходят люди, знающие ответ на подобную проблему((

Очень прошу помощи хоть с логикой, куда копать, если рабочего примера или ссылки не найдётся...
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Табы с сортируемыми таблицами (сделать не зависимыми[aja

Сообщение Loveorigami »

Не знаю как сделать)
Но давайте рассуждать логично
1. Почему сортировка идет по всем полям обоих таблиц? Очевидно, что у вас две (и более таблиц) в фильтре имеют одинаковые ID.
Другими совами ajax отлавливает первый попавшийся элемент и пытается с ним что-то сделать

Код: Выделить всё


<div id="table"></div>
<div id="table"></div>

В разметке такого быть не должно...
 
2. С пагинацией - видимо с учетом 1 - не проходит ajax запрос. А в контроллере стоит заглушка - если не ajax, значит редирект
3. Попробуйте для таблиц или элементов (не знаю как - сам неделю как с yii ))) ) сделать разные id
Перед этим гляньте в исходный код страницы. Правильно ли я сделал предположение в п.1
В консоли гляньте, что происходит при нажатии пагинации для 1 таблицы, и что происходит со второй.

Как то так )
Аватара пользователя
Altenrion
Сообщения: 44
Зарегистрирован: 2013.03.18, 12:05
Контактная информация:

Re: Табы с сортируемыми таблицами (сделать не зависимыми[aja

Сообщение Altenrion »

Ну по порядку,
Код приведенный выше есть не набросок а реальный код, в который к сожалению не заглянули.
В нем я вообще не указывал уникальных id.
Я не использовал gridview в котором хоть понимаю как id указать, соответственно и контроллера код приведен весь, участвующий в этом процессе.

Там нет заглушек и проверок ajax/ не ajax. Да, вычитывал, что с гридом это нужно но я не могу разобраться какие атрибуты указывать ему при вызове, поэтому пока использую CSort и пагинатор.

Ваши догадки основаны на большинстве вопросов в инете а не на моей проблеме и коде, к сожалению((

Любому конструктивному совету более близкому к проблеме буду очень благодарен.
Аватара пользователя
Altenrion
Сообщения: 44
Зарегистрирован: 2013.03.18, 12:05
Контактная информация:

Re: Табы с сортируемыми таблицами (сделать не зависимыми[aja

Сообщение Altenrion »

Ну приведите ссылку на тему, иди хоть наводки какие, люди гуру, ну очень нужно(((
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Табы с сортируемыми таблицами (сделать не зависимыми[aja

Сообщение Loveorigami »

Код приведенный выше есть не набросок а реальный код, в который к сожалению не заглянули.
В нем я вообще не указывал уникальных id.
=======
не заглянули, а обратили внимание - там нет двух таблиц, там pager может генерироваться с id - поэтому порекомендовал глянуть HTML код своей страницы.
--------
Ваши догадки основаны на большинстве вопросов в инете а не на моей проблеме и коде, к сожалению((
======
проблему вы создали себе сами. Я намекнул...
ответьте как программист - при посылке ajax запроса где вы намереваетесь получить результат?
пока что я вижу - где-то в какой-то таблице.... не важно - в первой или второй...
т.е. вы не контролируете процесс, не смотрите разницу в консоли... по 2 раза писать не буду...
Аватара пользователя
Altenrion
Сообщения: 44
Зарегистрирован: 2013.03.18, 12:05
Контактная информация:

Re: Табы с сортируемыми таблицами (сделать не зависимыми[aja

Сообщение Altenrion »

Прошу прощения, за резкость, уж сильно меня эта ситуация с таблицами измотала(

Посмотрел код страницы, так как сам id не указывал в ручную, yii сгенерил уникальные id для пагинаторов типа

Код: Выделить всё

 "<ul class="paginator" id="yw6">"
Собственно касательно отслеживания в консоли и кде бы то ни было еще, у меня параметры передаются GET запросом. И я понимаю разницу между GET POST и асинхроном, не первый день в коде ...

Проблемы были сформуллированны в первом посте :
  • 1) пагинация не ajax, и следовательно при попытке перейти на 2 страницу 2-ой таблицы , главная страница перезагружается, и отображается первая закладка.
    2)когда запускается сортировка, она идет "в лоб" , и соответственно пересортирует все таблицы. Как от этого уйти не знаю, не реализовывал.
Из чего хочется процитировать "по 2 раза писать не буду...", но все же хочется получить конструктивных совет как реализовать CSort и пагинацию с ajax, используя встроенные возможности не изобретая велосипеды.

п.с.: сортировка через GET едина для всех ибо var_dump($_GET) :

Код: Выделить всё

array (size=2)
  'page' => string '2' (length=1)
  'sort' => string 'S_NAME' (length=6)
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Табы с сортируемыми таблицами (сделать не зависимыми[aja

Сообщение Loveorigami »

ну смотрите...
1. убираем табы
2. ставим первую таблицу - все работает
3. убираем первую - ставим вторую - тоже работает. Тк. они одинаковые
4. ставим обе таблицы - происходит конфликт... Тк. они одинаковые
5. не хотим изобретать велосипед - думаем...
6. есть идея - сделать иммитацию табов. Т.е. вместо таба у вас будет прямая ссылка с параметром. Например - index/tab=1 и index/tab=2
7. при клике на таб отлавливаете переменную, делаете активным нужный div и в него рендерите partial с одной таблицей
8. итого - в коде у вас будет одна таблица и конфликтов по идее не должно быть...
Avgusto
Сообщения: 46
Зарегистрирован: 2013.11.07, 21:09

Re: Табы с сортируемыми таблицами (сделать не зависимыми[aja

Сообщение Avgusto »

Наводка(?):
Я с yii только знакомлюсь, но имею некоторый опыт с jquery плагином dataTables: http://www.datatables.net/
Так вот в dataTables при работе с таблицей очень удобно привязать её именно по id="myTable"
К ID таблицы там привязывается практически всё: аякс, куки состояния (сортировка, страница просмотра и т.д.)
В yii CGridView ID у таблиц не заметил, равно как и в Вашем html коде.

p.s. мне вообще удивительно, зачем было писать свой (yii) "сортировщик таблиц" при наличии мощных и уже готовых решений
Аватара пользователя
sapgv
Сообщения: 164
Зарегистрирован: 2013.05.27, 21:41

Re: Табы с сортируемыми таблицами (сделать не зависимыми[aja

Сообщение sapgv »

Я бы попробывал DataTable http://demo.niix.pl/edatatables
на каждую вкладку свою таблицу
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Табы с сортируемыми таблицами (сделать не зависимыми[aja

Сообщение anton44eg »

Avgusto писал(а):Наводка(?):
Я с yii только знакомлюсь, но имею некоторый опыт с jquery плагином dataTables: http://www.datatables.net/
Так вот в dataTables при работе с таблицей очень удобно привязать её именно по id="myTable"
К ID таблицы там привязывается практически всё: аякс, куки состояния (сортировка, страница просмотра и т.д.)
В yii CGridView ID у таблиц не заметил, равно как и в Вашем html коде.

p.s. мне вообще удивительно, зачем было писать свой (yii) "сортировщик таблиц" при наличии мощных и уже готовых решений
Как-то странно вы смотрели http://www.yiiframework.com/doc/api/1.1 ... #id-detail
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Табы с сортируемыми таблицами (сделать не зависимыми[aja

Сообщение ElisDN »

Ну как бы странно не использовать грид. Делаете два GridView и два CActiveDataProvider c разными pageVar для pagination.
Аватара пользователя
Altenrion
Сообщения: 44
Зарегистрирован: 2013.03.18, 12:05
Контактная информация:

Re: Табы с сортируемыми таблицами (сделать не зависимыми[aja

Сообщение Altenrion »

ElisDN, Благодарю вас что вы откликнулись на мою просьбу.

Не сочтите за наглость, но можете привести простой пример:
ElisDN писал(а): два GridView и два CActiveDataProvider c разными pageVar для pagination
С гридами как раз у меня и беда , оттого и использовал сорт и пагинацию отдельно(((

Буду очень признателен
LuchockVesely
Сообщения: 17
Зарегистрирован: 2014.08.21, 08:33

Re: Табы с сортируемыми таблицами (сделать не зависимыми[aja

Сообщение LuchockVesely »

сорри, если неверно въехал в тему
Altenrion писал(а):В админке необходимо сделать страницу, в которой будут несколько таблиц с сортировками, и пагинацией. Каждая такая таблица должна быть на отдельной закладке( Tab' е).
смысл идеи не рендерить всю страницу, а только нужную часть

контроллер

Код: Выделить всё

public function actionTst() {
        $accountsModel=new Accounts('search');
        $accountsModel->unsetAttributes();  // clear any default values
        $transModel=new Trans('search');
        $transModel->unsetAttributes();  // clear any default values
        $this->render('tab', array('accountsModel'=>$accountsModel, 'transModel'=>$transModel));
}
 
вьювер

Код: Выделить всё

$this->widget('zii.widgets.jui.CJuiTabs',array(
    'tabs'=>array(
        'Accounts List'=>array('id'=>'accountsTabId','content'=>$this->renderPartial(
                                        'accountsGrid',
                                        array('accountsModel'=>$accountsModel),TRUE
                                        )),
        'Transactions List'=>array('id'=>'transTabId','content'=>$this->renderPartial(
                                        'transGrid',
                                        array('transModel'=>$transModel),TRUE
                                        )),
        'Some Info'=>array('content'=>'всякая фигня', 'id'=>'tab3'),
    ),
    // additional javascript options for the tabs plugin
    'options'=>array(
        'collapsible'=>true,
    ),
));    
и два кода частичного рендеринга
1. accountsGrid.php

Код: Выделить всё

<?php
        $this->widget('zii.widgets.grid.CGridView', array(
            'id'=>'accounts-grid',
            'dataProvider'=>$accountsModel->search(),  
            'filter'=>$accountsModel,
            'selectionChanged'=>'function(id){$("#accountSearch_id").val($.fn.yiiGridView.getSelection(id))}',
            'columns'=>array(
                'id',
                'accountCode',
                array( 'name'=>'currencyCode', 'value'=>'$data->relCurrencies->currencyCode' ),
                'accountName',
                array(
                    'name'=>'created',
                    'value'=>'date("d.m.Y",strtotime($data->created))',
                ),
                array( 'name'=>'clientName', 'value'=>'$data->relClients->clientName' ),
                'paymentSystem_id' => array(
                     'name' => 'paymentSystem_id',
                     'value' => '$data->relPaymentSystems->psName', 
                     'filter'=> Paymentsystems::f_selPaymentSystems(),
                ),
            )
        )); 
 ?>
2. transGrid

Код: Выделить всё

<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'trans-grid',
    'dataProvider'=>$transModel->search(),
    'filter'=>$transModel,
    'columns'=>array(
        'id',
        'trandate',
        'operType_id',
        'deb_id',
        'cre_id',
        'currency_id',
        'nominal',
        'value',
    ),
)); ?>
Altenrion писал(а):1) пагинация не ajax,
пагинация = ajax
LuchockVesely
Сообщения: 17
Зарегистрирован: 2014.08.21, 08:33

Re: Табы с сортируемыми таблицами (сделать не зависимыми[aja

Сообщение LuchockVesely »

контроллер другой, сори
public function actionIndex() {
$accountsModel=new Accounts('search');
$accountsModel->unsetAttributes(); // clear any default values
$transModel=new Trans('search');
$transModel->unsetAttributes(); // clear any default values

if (isset($_GET['ajax'])) {
if (isset($_GET['Accounts_page'])) { // на первый клик
$this->renderPartial('accountsGrid', array('accountsModel'=>$accountsModel));
} else if (isset($_GET['Trans_page'])) { // на первый клик
$this->renderPartial('transGrid', array('transModel'=>$transModel));
} else if ($_GET['ajax']=='accounts-grid') {
$this->renderPartial('accountsGrid', array('accountsModel'=>$accountsModel));
} else if ($_GET['ajax']=='trans-grid') {
$this->renderPartial('transGrid', array('transModel'=>$transModel));
}
} else {
$this->render('tab', array('accountsModel'=>$accountsModel, 'transModel'=>$transModel));
}
}
Аватара пользователя
Altenrion
Сообщения: 44
Зарегистрирован: 2013.03.18, 12:05
Контактная информация:

Re: Табы с сортируемыми таблицами (сделать не зависимыми[aja

Сообщение Altenrion »

Сейчас вот меня окончательно запутали( У вас этот код хоть работает? Как вы делаете renderPartial резных видов из одного экшена , когда у вас этот же renderPartial выполняется в табах. Вообще не понятно, я бы понял если бы внутри табов были вызовы двух разных экшенов, и они ренедрили по условию аякс не аякс, но с вашим примером больше вопросов возникает ( можете прояснить?

п.с.: и откуда в вашем примере берется параметр для ограничения строк на страницу пагинатора?

п.п.с: Меня даже в конечном итоге, больше напрягает не аяксовая сортировка, т.к. без пагинации еще как то можно жить, а вот без сортировки никак. (

п.п.п.с: Откуда получается $_GET['ajax'] ? У вас ничего специфичного я не вижу, и не могу отследить формирование этого Гет-а .
LuchockVesely
Сообщения: 17
Зарегистрирован: 2014.08.21, 08:33

Re: Табы с сортируемыми таблицами (сделать не зависимыми[aja

Сообщение LuchockVesely »

Altenrion писал(а):У вас этот код хоть работает?
да)
Altenrion писал(а): Как вы делаете renderPartial резных видов из одного экшена , когда у вас этот же renderPartial выполняется в табах
немножко не понял. в табах рендеры partial с разными моделями и вьювами.
в акшене отслеживаются параметры запроса, которые приходят от клиента. геты формируются гридовским плагином js при генерации таблицы грида на стороне клиента.
контроллер. при первом вызове контроллера - просто рендер с двумя моделями таблиц: render('tab', array('accountsModel'=>$accountsModel, 'transModel'=>$transModel)); , которые в табе раскидываются по закладкам.
контроллер он же обработчик дальнейших запросов грида, поэтому можно отследить что передается на сервер. в частности ajax в котором указывется id грида или (при начальной установке - первой генерации грида) номер запрашиваемой страницы, где в качестве параметра передается model_page со значением нужного номера страницы. и все
Altenrion писал(а):п.с.: и откуда в вашем примере берется параметр для ограничения строк на страницу пагинатора?

по умолчанию у датапровайдера, но там можно поменять наверное. толком не смотрел. не нравится он мне, собственно как и сам грид.
Altenrion писал(а): без пагинации еще как то можно жить, а вот без сортировки никак.
в модели метод search
Altenrion писал(а): п.п.п.с: Откуда получается $_GET['ajax'] ? У вас ничего специфичного я не вижу, и не могу отследить формирование этого Гет-а .
плагин jquery.YiiGridVie.js , он подключен на странице с гридом
Аватара пользователя
Altenrion
Сообщения: 44
Зарегистрирован: 2013.03.18, 12:05
Контактная информация:

Re: Табы с сортируемыми таблицами (сделать не зависимыми[aja

Сообщение Altenrion »

без пагинации еще как то можно жить, а вот без сортировки никак.
в модели метод search
Я имею ввиду что она тоже обновляет всю страницу
Ответить