1

Тема: Сортировка вывода дочерних страниц

для вывода списка дочерних страниц использую вот этот код отсюда

<?php
  $page = get_page_slug(false);
  $children = getChildren($page);
  echo '<ul>';
  foreach($children as $child) {
    $url = generate_url($child);
    echo '<li><a href="'.$url.'">'.returnPageField($child, 'title').'</a></li>';
  }
  echo '</ul>';
?>

Для совместимости кода с GetSimple CMS 3.3 следует заменить вызов функции generate_url() на find_url():

$url = find_url($child, $page);

Непонятно, по какому принципу он сортирует вывод. Мне нужно, чтобы в начале выводились страницы подразделов (т.е. те, у которых есть еще дочерние страницы), а потом была сортировка по дате создания.

Как это сделать? (пожалуйста, инструкции на уровне копипаста, я новичок)

Поделиться

2

Re: Сортировка вывода дочерних страниц

Еще вопрос по добавлению выпадающего меню. Я установил плагины

I18N Base    {i18n_base/PLUGIN_DESCRIPTION}
Версия 3.3.1 — Автор: Martin Vlcek    Отключить
I18N Navigation    {i18n_navigation/PLUGIN_DESCRIPTION}
Версия 3.3.1 — Автор: Martin Vlcek    Отключить
I18N Search

Но не могу найти подробную инструкцию для чайника по созданию выпадающего меню. Ткните ссылками пожалуйста

Поделиться

3

Re: Сортировка вывода дочерних страниц

сделать меню "выпадающим" плагин не поможет, для этого нужно знать CSS и JS, плагин создает вложенное меню из дочерних страниц

<ul>
    <li>Первый уровень</li>  
    <li>Первый уровень
        <ul>
            <li>Второй уровень</li>  
            <li>Второй  уровень
                <ul>
                    <li>Третий уровень</li>  
                    <li>Третий уровень</li> 
                    <li>Третий уровень</li>  
                </ul>
            </li> 
            <li>Второй уровень</li>  
        </ul>
    </li> 
    <li>Первый уровень</li>  
</ul>

если ваше меню уже сверстано в шаблоне, то вы можете использовать рендеринг в компоненте
https://getsimplecms.ru/plaginy-dlya-ge … 0%BD%D1%8E

пример использования плагина вы можете найти в бесплатной теме http://get-simple.info/extend/theme/uikit/1207/

leo2 пишет:

Еще вопрос по добавлению выпадающего меню. Я установил плагины

I18N Base    {i18n_base/PLUGIN_DESCRIPTION}
Версия 3.3.1 — Автор: Martin Vlcek    Отключить
I18N Navigation    {i18n_navigation/PLUGIN_DESCRIPTION}
Версия 3.3.1 — Автор: Martin Vlcek    Отключить
I18N Search

Но не могу найти подробную инструкцию для чайника по созданию выпадающего меню. Ткните ссылками пожалуйста

Поддержать GetSimple CMS по-русски ЯДом

Сайт olsv64

Поделиться

4

Re: Сортировка вывода дочерних страниц

olsv64 пишет:

сделать меню "выпадающим" плагин не поможет, для этого нужно знать CSS и JS, плагин создает вложенное меню из дочерних страниц

если ваше меню уже сверстано в шаблоне, то вы можете использовать рендеринг в компоненте
https://getsimplecms.ru/plaginy-dlya-ge … 0%BD%D1%8E

пример использования плагина вы можете найти в бесплатной теме http://get-simple.info/extend/theme/uikit/1207/

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

У меня тема ResponsiveInnovation. Но ваша тема тоже хороша, вполне можно использовать для личного сайта. Какой файл стиля отвечает за выпадающее меню?

Галочки "добавить в меню" у меня стоят только для страниц-разделов самого высокого уровня. Если ставить галочки на других страницах, то они выводятся в главном меню в шапке, а мне этого не нужно.

Ну и остался вопрос про сортировку вывода статей в разделе.

Еще вопрос - по вашей ссылке нашел вывод меню в боковой панели командой

<?php get_i18n_navigation(return_page_slug(),1,99,I18N_SHOW_TITLES); ?>

Поставил уровень 1, чтобы выводилось только подменю раздела. Но есть нюанс - выводится меню всех подразделов 2 и 3 уровня. Можно ли выводить на 2 уровне все подменю (так сейчас и делается), а в подразделах 3 уровня - только статьи этого уровня и только для текущего подраздела? Сейчас выводятся списки страниц для соседних подразделов тоже. Как это сделать в шаблоне по умолчанию, а не на уровне страниц?

Поделиться

5

Re: Сортировка вывода дочерних страниц

извините, как оказалось не все файлы залил в репозиторий, скачайте тему здесь http://demo.getsimplethemes.ru/free/?item=uikit_html
в этой теме приведен пример использования рендеринга с использованием фреймворка UIkit
также там есть плагин галереи с лайтбоксом этого же фреймворка
странно, что никто мне не написал с того форума

Поддержать GetSimple CMS по-русски ЯДом

Сайт olsv64

Поделиться

6 (2019-11-10 02:07:52 отредактировано leo2)

Re: Сортировка вывода дочерних страниц

ох-ох, что же вы не предупредили, что ваша тема затирает настройки компонентов. sad Я не сделал бэкап, теперь ковыряю, восстанавливаю настройки, которые делал эти 2 дня.

В теме не оказалось breadcrumb - как активировать?
Также нет вывода даты публикации страницы, как это есть в теме Innovation. Как добавить?

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

(% searchform %)

(% searchresults %)

. Как убрать?

Поделиться

7

Re: Сортировка вывода дочерних страниц

ну, вообще-то, здесь есть предупреждение http://get-simple.info/extend/theme/uikit/1207/
почитайте описания плагинов, скопируйте код в теме Innovation и вставьте его куда нужно, функция breadcrumb есть в плагине I18N, есть и отдельные плагины для breadcrumb

Поддержать GetSimple CMS по-русски ЯДом

Сайт olsv64

Поделиться

8

Re: Сортировка вывода дочерних страниц

да, не заметил предупреждения.
Скопировал код из Innovation , благо функция оттуда в теме уже оказалась.

С другими breadcrumb плагинами не совладал, они выводят список в колонку, как прописать css сходу не понимаю.

По настройке вывода тэгов в форме поиска с I18n разобрался

Спасибо за помощь.

Поделиться

9 (2019-11-10 10:37:10 отредактировано ufopera)

Re: Сортировка вывода дочерних страниц

>> Какой файл стиля отвечает за выпадающее меню?

Можете попробовать мой CSS код выпадающего меню:

.main_nav ul{background:#fff;box-shadow: 0 2px 12px rgba(0,0,0,.4);}
.main_nav li{display:inline-block;margin:0 -2px;position:relative;list-style:none;}
.main_nav li.open:after{border:4px solid transparent;border-top-color:#000;content:'';margin-top:-1px;position:absolute;right:4px;top:50%;}
.main_nav ul li.open:after{border:4px solid transparent;border-left-color:#000;content:'';position:absolute;top:40%;right:5px;} 

.main_nav li a{padding:10px 15px;color:#444;font-weight:400;text-decoration:none;line-height:normal;}
.main_nav li ul{height:auto;background:#eee;display:none;position:absolute;top:38px;left:0;z-index:140;width:224px;text-align:left;padding:0;}

.main_nav li:hover > a{background:#eee;}
.main_nav li li{display:block;background:inherit;color:inherit;}
.main_nav li li a{height:auto;padding:8px 10px;font-size:.94em;display:block;}
.main_nav li:hover > ul{display:block;}
.main_nav li li ul{top:0;left:226px;}
.main_nav .current,.main_nav .currentpath,
.main_nav li li:hover > a{background:#ddd;}

Сайт ufopera

Поделиться

10

Re: Сортировка вывода дочерних страниц

leo2 пишет:

Непонятно, по какому принципу он сортирует вывод. Мне нужно, чтобы в начале выводились страницы подразделов (т.е. те, у которых есть еще дочерние страницы), а потом была сортировка по дате создания.

Как это сделать? (пожалуйста, инструкции на уровне копипаста, я новичок)

Подзабыл и проверять лень,
отсортировать можно как-то так:

function usortTest($a, $b) {
    return  getChildren($a);
}

usort($children, "usortTest");
foreach($children as $child) {
......
}

Ну хоть что-то подсказал)

Сайт ufopera

Поделиться

11 (2019-11-10 17:41:23 отредактировано leo2)

Re: Сортировка вывода дочерних страниц

ufopera пишет:

отсортировать можно как-то так:

function usortTest($a, $b) {
    return  getChildren($a);
}

usort($children, "usortTest");
foreach($children as $child) {
......
}

Спасибо, сортирует, только выводит страницы с подразделами в конце списка. Я поменял на

return  getChildren($b);

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

И по сортировке самих статей тоже - сортирует не по дате и не по алфавиту.

И еще смежный вопрос - какой нужно задать параметр для get_i18n_navigation () для указания порядка сортировки? А то у меня вот такой вызов

    get_i18n_navigation(return_page_slug(),2,99,I18N_SHOW_TITLES | I18N_OUTPUT_TITLE );  

сортирует родительские страницы в конце, а обычные - непонятно как.

Поделиться

12

Re: Сортировка вывода дочерних страниц

leo2 пишет:

Еще вопрос - по вашей ссылке нашел вывод меню в боковой панели командой

<?php get_i18n_navigation(return_page_slug(),1,99,I18N_SHOW_TITLES); ?>

Поставил уровень 1, чтобы выводилось только подменю раздела. Но есть нюанс - выводится меню всех подразделов 2 и 3 уровня. Можно ли выводить на 2 уровне все подменю (так сейчас и делается), а в подразделах 3 уровня - только статьи этого уровня и только для текущего подраздела? Сейчас выводятся списки страниц для соседних подразделов тоже. Как это сделать в шаблоне по умолчанию, а не на уровне страниц?

Сейчас сделал так

echo '<h3>Страницы подраздела </h3>';
    if (get_parent(0)=='linux') 
    {get_i18n_navigation(return_page_slug(),2,99,I18N_SHOW_TITLES | I18N_OUTPUT_TITLE ); } 
    elseif (get_parent(0)=='web-design') 
    {get_i18n_navigation(return_page_slug(),2,99,I18N_SHOW_TITLES | I18N_OUTPUT_TITLE ); }
    else {get_i18n_navigation(return_page_slug(),1,2,I18N_SHOW_TITLES | I18N_OUTPUT_TITLE );
         }

То есть прописываю вручную slug для страниц, у которых есть 2 уровень вложенности. Как прописать универсальное условие? Что означает цифра в параметрах функции get_parent (?). Я видел значения 0 и 1, что они означают?

Поделиться

13 (2019-11-10 18:01:42 отредактировано ufopera)

Re: Сортировка вывода дочерних страниц

- сортирует сначала разделы - правильно ли я сделал?

Если устраивает результат, да


И как сделать внутри этой сортировки еще сортировку по алфавиту?
И можно ли страницы разделов как-то выделить стилем  - а то они одинаково с обычными страницами в списке.

Как-то так:
Не проверял!

<?php

  $page = get_page_slug(false);
  $children = getChildren($page);
  
  asort($children);
  reset($children);  
  
  foreach($children as $child) {
      
      $url = generate_url($child);
      
      if(getChildren($child)){
        $tmpParent .= '<li мойКласс ><a href="'.$url.'">'.returnPageField($child, 'title').'</a></li>';
    }else{
        $tmpChildren .= '<li><a href="'.$url.'">'.returnPageField($child, 'title').'</a></li>';        
    }

  }
  
  echo '<ul>';
  echo '$tmpParent';
  echo '$tmpChildren';
  echo '</ul>';
  
  
?>

вариант2 - синтаксически правильнее 

  foreach($children as $child) {
      
      $url = generate_url($child);
      $t_title = returnPageField($child, 'title');
      
      if(getChildren($child)){
            $tmpParent .= "<li мойКласс ><a href=\"$url\">$t_title</a></li>";
        }else{
        $tmpChildren .= "<li мойКласс ><a href=\"$url\">$t_title</a></li>";        
        }

  }

Сайт ufopera

Поделиться

14

Re: Сортировка вывода дочерних страниц

я в пхп не разбираюсь, поэтому, что значит цифра 0, сказать не могу
вы можете воспользоваться плагином https://getsimplecms.ru/plaginy-dlya-ge … om-fields/ и создать для каждой создаваемой страницы поле с выпадающим списком для выбора уровня меню

<?php if(return_custom_field('level')=='Первый уровень') { ?>
  <?php get_component('level-1'); ?>
 ?>
<?php if(return_custom_field('level')=='Второй уровень') { ?>
  <?php get_component('level-2'); ?>
 ?>
Поддержать GetSimple CMS по-русски ЯДом

Сайт olsv64

Поделиться

15 (2019-11-10 18:45:47 отредактировано ufopera)

Re: Сортировка вывода дочерних страниц

leo2 пишет:

Что означает цифра в параметрах функции get_parent (?). Я видел значения 0 и 1, что они означают?

0 = false
1 = true
Зачем? не кто этого не знает,
но можно глянуть в документацию

Сайт ufopera

Поделиться

16 (2019-11-10 22:00:42 отредактировано leo2)

Re: Сортировка вывода дочерних страниц

ufopera пишет:

вариант2 - синтаксически правильнее

Спасибо!
Тестирую пока вот так (у вас были лишние кавычки вокруг переменных для echo)

<?php
  $page = get_page_slug(false);
  $children = getChildren($page);
  
  asort($children);
  reset($children);  
  
  foreach($children as $child) {
      
      $url = find_url($child, $page);
      $t_title = returnPageField($child, 'title');
      
      if(getChildren($child)){
            $tmpParent .= "<span class=\"parent-list\" ><a href=\"$url\">$t_title</a></span><br>";
        }else{
        $tmpChildren .= "<li  ><a href=\"$url\">$t_title</a></li>";        
        }
  }
  If ($tmpParent!=NULL) {echo 'Подразделы:<br>'.$tmpParent;}
  else {}
  echo '<ul>';
  echo $tmpChildren;
  echo '</ul>';
  
?>

.parent-list {text-transform: uppercase;}

Но сортирует не по названию страницы, а по slug (скорее всего, оригинальный скрипт так же сортирует, я только сейчас проверил первые буквы slug). Что поменять для сортировки по title ?

Поделиться

17 (2019-11-11 00:02:16 отредактировано leo2)

Re: Сортировка вывода дочерних страниц

ufopera пишет:
leo2 пишет:

Что означает цифра в параметрах функции get_parent (?). Я видел значения 0 и 1, что они означают?

0 = false
1 = true
Зачем? не кто этого не знает,

я пробовал менять это значение, и даже без него вообще - и вот результат:
если ничего в скобках или 1 - то перед списком выводится slug родительской страницы подраздела
если 0 - то slug перед списком не выводится.

но можно глянуть в документацию

smile

Поделиться

18 (2019-11-11 00:37:38 отредактировано ufopera)

Re: Сортировка вывода дочерних страниц

leo2 пишет:

Но сортирует не по названию страницы, а по slug (скорее всего, оригинальный скрипт так же сортирует, я только сейчас проверил первые буквы slug). Что поменять для сортировки по title ?

Не знаю,
можно и дальше огород городить,
загонять в массив, ключ->значение(slug->title) и потом сортировать (uni_sorter функция ниже).
Но я бы воспользовался уже готовой глобальной переменной $pagesArray .
и уже с помощью ее формировал, что и как мне надо.

global $pagesArray;

usort($pagesArray, uni_sorter('title'));  


// фукция сортировки
function uni_sorter($key) {
  return function ($a, $b) use ($key) {
      if (!isset($a[$key])) return 1;
      if (!isset($b[$key])) return 0;
    return strnatcmp($a[$key], $b[$key]);
  };
}

Сайт ufopera

Поделиться

19

Re: Сортировка вывода дочерних страниц

ufopera пишет:

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

global $pagesArray;

usort($pagesArray, uni_sorter('title'));  


// фукция сортировки
function uni_sorter($key) {
  return function ($a, $b) use ($key) {
      if (!isset($a[$key])) return 1;
      if (!isset($b[$key])) return 0;
    return strnatcmp($a[$key], $b[$key]);
  };
}

А как это использовать? Это совсем не похоже на модификацию начального скрипта smile

Поделиться

20

Re: Сортировка вывода дочерних страниц

olsv64 пишет:

ну, вообще-то, здесь есть предупреждение http://get-simple.info/extend/theme/uikit/1207/
почитайте описания плагинов, скопируйте код в теме Innovation и вставьте его куда нужно, функция breadcrumb есть в плагине I18N, есть и отдельные плагины для breadcrumb

Вы вроде разобрались досконально с I18N, не подскажете, как все-таки задать сортировку по title  в функции

get_i18n_navigation(return_page_slug(),2,99,I18N_SHOW_TITLES | I18N_OUTPUT_TITLE );

Я нашел только про сортировку в функции search, а в navigation она есть?

Поделиться

21

Re: Сортировка вывода дочерних страниц

В навигации вы можете указывать последовательность при создании страницы http://prntscr.com/pv4ivl или после на этой вкладке путем перетаскивания http://prntscr.com/pv4i2b

Поддержать GetSimple CMS по-русски ЯДом

Сайт olsv64

Поделиться

22

Re: Сортировка вывода дочерних страниц

olsv64 пишет:

В навигации вы можете указывать последовательность при создании страницы http://prntscr.com/pv4ivl

у меня страницы не все в меню

или после на этой вкладке путем перетаскивания http://prntscr.com/pv4i2b

Так вручную работает, спасибо.
Но хотелось бы автоматически, по title . Это возможно с get_navigation?

Поделиться

23

Re: Сортировка вывода дочерних страниц

leo2 пишет:

Но хотелось бы автоматически, по title . Это возможно с get_navigation?

поищите у разработчика плагина http://mvlcek.bplaced.net/

Поддержать GetSimple CMS по-русски ЯДом

Сайт olsv64

Поделиться

24

Re: Сортировка вывода дочерних страниц

leo2 пишет:

Но хотелось бы автоматически, по title . Это возможно с get_navigation?

это возможно в плагине I18N Search с сортировкой по +title, этот плагин позволяет сортировать результаты поиска по любому полю страницы

Поддержать GetSimple CMS по-русски ЯДом

Сайт olsv64

Поделиться

25 (2019-11-12 12:41:13 отредактировано ufopera)

Re: Сортировка вывода дочерних страниц

Если уж и дольше городить, то хоть с пользой для общества wink
Встречайте: Расширенный аналог функции getChildren!!!
Тест-пример, копипаст-вариант
РАБОТОСПОСОБНОСТЬ НЕ ПРОВЕРЯЛ!

// функция сортировки
function uni_sorter($key) {
  return function ($a, $b) use ($key) {
      if (!isset($a[$key])) return 1;
      if (!isset($b[$key])) return 0;
    return strnatcmp($a[$key], $b[$key]);
  };
}

# Расширенный аналог функции getChildren
#    $id = имя страницы
#    $keySort = "" поведение getChildren 
#    $keySort = "key" поведение getChildren с сортировкой по ключу
# $param = (для оптимизации) проверка на бездетность
function getChildrenEx($id, $keySort="", $param = 0) {
    
    global $pagesArray;
    $PagesArr = array();
    
    if($keySort) usort($pagesArray, uni_sorter($keySort));
    
    foreach ($pagesArray as $item) {
        if ($item['parent'] == $id) {
            $PagesArr[] = $item;
            if($param) return $PagesArr;
        }
    }
    
    return $PagesArr;
}



$page = get_page_slug(false);
$children = getChildrenEx($page,'title'); 

foreach($children as $child) {
    
    $url = find_url($child, $page);
    $t_title = returnPageField($child, 'title');

    if(getChildrenEx($child,'',TRUE)){
          $tmpParent .= "<span class=\"parent-list\" ><a href=\"$url\">$t_title</a></span><br>";
      }else{
      $tmpChildren .= "<li  ><a href=\"$url\">$t_title</a></li>";        
    }
}

If ($tmpParent!=NULL) {echo 'Подразделы:<br>'.$tmpParent;}
else {}
echo '<ul>';
echo $tmpChildren;
echo '</ul>';

Сайт ufopera

Поделиться