AlexMoiseyuk VIP
Total posts: 123
16 Сен 2014 18:49

предлагаю интересную задачку:

в категории с помощью календаря реализовано расписание занятий для преподавалелей в университете. для каждого занятия отдельная статья с множеством полей. Одно из полей это мультивыбор фамилий преподавателей. другое -например, номер занятия (поле Выбор=select): "первое", "второе" и т.д.

задание: сделать такой фильтр, чтобы можно было выбрать номер (например, "первое") и увидеть какие переподаватели есть на (первом) занятии, а какие свободны.

я пробовал сделать преподавателей не полем, а подкатегориями и вывести в шаблоне "default-cindex-custom" в корне категории с количеством статей в подкатегориях, в надежде что после применения фильтра у меня изменится и количество статей в этих подкатегориях. но после применения фыльтра "default-cindex-custom" просто пропадает из вывода, остается только отфильтрованный список.

И после того как увидел количества в фильтре (картинка), решил что можно делать и полем.

2014-09-16_212522

идея в том чтобы: 1) вывести все возможные опции (фамилии=значения) поля с количествами (в не зависимости есть они в статьях или нет - если нет то, например, со значением "0") в "default-markup-custom" или модуль. и 2) в эти количества учесть только статьи выведенные после применения фильтрации

Последние изменения: 23 Сен 2014


Sergey
Total posts: 13,748
17 Сен 2014 00:40

Barabashka 1) вывести все возможные опции (фамилии=значения) поля с количествами (в не зависимости есть они в статьях или нет - если нет то, например, со значением "0") в "default-markup-custom" или модуль.

Даже если вывести всех, то это не будет реагировать на текущие фильтры. Тоесть, вы применили один фильтр, и другой отобразил уже другие цифры. Так не работает. Фильтр всегда показывает теже цифры.


AlexMoiseyuk VIP
Total posts: 123
17 Сен 2014 06:47

Sergey Даже если вывести всех, то это не будет реагировать на текущие фильтры. Тоесть, вы применили один фильтр, и другой отобразил уже другие цифры. Так не работает. Фильтр всегда показывает теже цифры.

а есть вообще возможность вывести значения полей. даже не в фильтре, а в любом другом месте. и отдельно получить количество отфильтрованых статей, чтобы вычесть от существующего и вывести разницу?


Sergey
Total posts: 13,748
17 Сен 2014 07:13

Ну конечно. Всегда можно сделать запрос к базе даже в шаблоне и ввывести значение.


AlexMoiseyuk VIP
Total posts: 123
17 Сен 2014 09:09

а по поводу получения количества статтей не с помощью $cats[$item->id]->records_num = (int)@$nums[$item->id];, а только тех, которые остались после применения фильтра. можете подсказать? как я понимаю,что-то подобное на функцию getItems() в com_cobalt/models/categories.php я не могу использовать так, как она получает количество из базы данных. или это тоже можно как-то фильтровать? =)


Sergey
Total posts: 13,748
18 Сен 2014 02:44

После применения фильтов не могу подсказать. Если бы это было так просто как написать коммент на форуме, то это просто было бы уже в Кобальте. Но это очень не тривиальная задача.


AlexMoiseyuk VIP
Total posts: 123
22 Сен 2014 21:46

я решил задачку. =) Были использовани категории

код рабочий, но я был би рад если бы вы взглянули, может у кобальта есть более рациональные методы исполнения некоторых действий

<?php if($markup->get('filters.worns') && count($this->worns)):?>
<div class="filter-worns"> 
<!-- вставил код здесь (перед выводом значений примененных фильтров) для выполнения только при фильтрации -->
<?php 
    $busy = '<span class="busy-icon" rel="tooltip" data-original-title="'. JText::_('BUSY').'">'
    .HTMLFormatHelper::icon('user-female.png').'</span>'; //переменная "преподаватель занят"

    $db = JFactory::getDbo();//зайти в БД
    $cat_title = $db->getQuery(true);
    $cat_title->select('title');//выбрать названия категорий
    $cat_title->from('#__js_res_categories'); // с таблици #__js_res_categories
    $cat_title->where('parent_id=44'); // только для подкатегорий с родителем 44
    $cat_title_list = $db->setQuery($cat_title)->loadAssocList(); /*метод loadObjectList() не удалось использовать из-за ошибки: "Object of class stdClass could not be converted to string" */
    foreach($cat_title_list AS $cat_title_val) { //для каждого значения списка категорий 
      foreach($cat_title_val AS $cat_title_value) { //вывести масив названия (состоит из одного елемента) и для каждого названия  
         foreach($this->items AS $records){  // пробежаться по каждой из выведеных (только отфильтрованных) статей 
             foreach($records->categories as  $item_cat_title) { // и получить масив названий категорий
              if ($cat_title_value==$item_cat_title){ //сверить названия категорий из базы с категориями выведенных статей
              $cat_title_value.=$busy;
              break;  //вийти из цикла когда хотя бы одно значение совпадает      
              }
            }
         } 
      echo $cat_title_value.'</br>';

     }
    } 
?>
</div>

Sergey
Total posts: 13,748
23 Сен 2014 02:25
<?php if($markup->get('filters.worns') && count($this->worns)):?>
<div class="filter-worns"> 
<!-- вставил код здесь (перед выводом значений примененных фильтров) для выполнения только при фильтрации -->
<?php 
    $busy = '<span class="busy-icon" rel="tooltip" data-original-title="'. JText::_('BUSY').'">'
    .HTMLFormatHelper::icon('user-female.png').'</span>'; //переменная "преподаватель занят"

    $db = JFactory::getDbo();//зайти в БД
    $cat_title = $db->getQuery(true);
    $cat_title->select('title');//выбрать названия категорий
    $cat_title->from('#__js_res_categories'); // с таблици #__js_res_categories
    $cat_title->where('parent_id=44'); // только для подкатегорий с родителем 44
    $cat_title_list = $db->setQuery($cat_title)->loadColumn();

    foreach($this->items AS $records) {
      foreach($records->categories as  $item_cat_title) { // и получить масив названий категорий
        if (in_array($item_cat_title, $cat_title_list)){ //сверить названия категорий из базы с категориями выведенных статей
          echo $item_cat_title . ' ' . $busy;
          break;
        }
      }
    } 
?>
</div>

Как то так. Но это просто оптимизация. А так то тоже самое.


AlexMoiseyuk VIP
Total posts: 123
23 Сен 2014 05:19

спасибо огромное!)

Работает на Cobalt