Порядок вывода полей в записи

ЕСТЬ РЕШЕНИЕ InstantCMS 2.X
#1 22 июля 2021 в 20:27

Добрый вечер!

Подскажите, есть возможность вывода полей в записи в определённой последовательности?

Например по системному имени в таком порядке: photos2, photos1, photos3..  В форме добавления записи нужен другой порядок полей

#2 22 июля 2021 в 20:41

Возможность такая есть.

Но придется немного поразбираться в коде. И либо в хуке изменить порядок. Либо в шаблоне вывода записи.

 

#3 22 июля 2021 в 20:54

И либо в руке изменить порядок

Zau4man

Это где?)

В шаблоне вроде нашел где выводятся поля https://github.com/instantsoft/icms2/blob/master/templates/default/content/default_item.tpl.php#L35

только как это реализовать? (не силён в ПХП). Как массив $fieldset['fields'] пересортировать по полю $field['name'] с такими-то значениями?

#4 22 июля 2021 в 21:00

 denmois, перебрать массив с помощью того же foreach, и сформировать новый $fieldset['fields'] который уже выводить.

Тут надо на месте разбираться. Универсального кода не вижу.

#5 23 июля 2021 в 12:31

В шаблоне вроде нашел где выводятся поля https://github.com/instantsoft/icms2/blob/master/templates/default/content/default_item.tpl.php#L35

denmois

Универсального решения действительно не видится. Может что-то подойдёт из этих функций

Простенько поднять/опустить поля можно обычными условиями.

Поднимаем:

  1. if($field['name'] == 'photos2') {
  2. photos2
  3. } elseif($field['name'] == 'photos1') {
  4. photos1
  5. } else {
  6. остальные
  7. }

Опускаем оператором !=

Вообще-то можно и без цикла перебора обойтись

#6 23 июля 2021 в 13:39

Спасибо за советы

Поднимаем:

  1. if($field['name'] == 'photos2') {
  2. photos2
  3. } elseif($field['name'] == 'photos1') {
  4. photos1
  5. } else {
  6. остальные
Олег Васильевич я

Я так понимаю эти операторы должны быть внутри foreach ($fieldset['fields'] as $field), а тогда смысл? Порядок останется прежним.

Пока сделал вот так:

  1. <?php if (!empty($item['photo'])) {
  2. echo $fields['photo']['handler']->parse( $item['photo'] );
  3. }?>

для каждого поля в нужном порядке, что конечно не очень красиво. Полей много.

Была идея задать array(photos2',photos1','photos3') и в соответствии сделать выборку в новый массив в нужном порядке. Но пока не найду реализацию.

#7 23 июля 2021 в 22:42

Я так понимаю эти операторы должны быть внутри foreach ($fieldset['fields'] as $field), а тогда смысл? Порядок останется прежним.

denmois

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

Пока сделал вот так:

<?php if (!empty($item['photo'])) {

    echo $fields['photo']['handler']->parse( $item['photo'] );

}?>

Боюсь снова ошибиться, но лучше ещё проверить на включённость вывода в записи и разрушить cоответствующий элемент в массиве:

  1. <?php if ($fields['name']['is_in_item']){ ?>
  2. выводим поле как нужно
  3. <?php } ?>
  4. <?php unset($fields['name']); ?>
  5. <?php } ?>

Не помню, начиная с какой версии, удалить из массива системные поля с помощью unset() не получится (нужно отключать поле для вывода в записи; соответственно, для таких полей и в условии нужно убрать проверку на включённость вывода)

-----------------------------------

Неужели не нашли в сети подходящей функции для решения задачи?

#8 23 июля 2021 в 23:44

Подскажите, есть возможность вывода полей в записи в определённой последовательности?

denmois

Зайдите в панель управления.

Типы контента — Ваштипконтента — Поля. И перетягивайте поля мышью вниз или ввер, как надо.

Таким образом можно изменить порядок полей при выводе. 

Но системные поля, типа заголовка и даты, остаются на своих местах вне зависимости от этих настроек. 

#9 24 июля 2021 в 15:06

Неужели не нашли в сети подходящей функции для решения задачи?

Олег Васильевич я

Конкретной функции не нашел. А распаковать и перебрать массив мне не по зубам с моими познаниями.

Зайдите в панель управления.

Типы контента — Ваштипконтента — Поля. И перетягивайте поля мышью вниз или ввер, как надо.

Таким образом можно изменить порядок полей при выводе. 

Но системные поля, типа заголовка и даты, остаются на своих местах вне зависимости от этих настроек. 

Ris

Андрей, рад что вы зашли в тему! Но вы не внимательно прочитали первый пост. 

В форме добавления записи нужен другой порядок полей

denmois



#10 24 июля 2021 в 15:29

В форме добавления записи нужен другой порядок полей

denmois

Так это легче форму добавления перебрать, чем городить огород с пересортировкой массива.

Согласитесь, добавление случается реже просмотра.

#11 24 июля 2021 в 16:21

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

#12 24 июля 2021 в 17:16

Группировка полей используется при выводе? Можно сделать массив типа

  1. <?php $fields_ordering = array(photos2',photos1','photos3'); ?>

 только перечислить все поля в этом массиве в нужном порядке. И потом в цикле вместо 

  1. <?php foreach ($fieldset['fields'] as $field) { ?>

прописать подобное

  1. <?php
  2. foreach ($fields_ordering as $field_name) {
  3. $field = $fieldset['fields'][$field_name];
  4. ?>
#13 24 июля 2021 в 18:13

То, что надо! Только почему-то ругается

Notice: Undefined index: phone in /var/www/....   на строку <?php $field = $fieldset['fields'][$field_name];?>

  1. <?php if (!empty($fieldset['fields'])) { ?>
  2. <?php $fields_ordering = array('phone','viber','whatsapp'); ?>
  3.  
  4. <?php foreach ($fields_ordering as $field_name) {
  5. $field = $fieldset['fields'][$field_name];?>
#14 24 июля 2021 в 18:23

Вполне возможно, надо поставить условие на заполненость поля типа такого

  1. <?php
  2. foreach ($fields_ordering as $field_name) {
  3. if (empty($fieldset['fields'][$field_name])){ continue; }
  4. $field = $fieldset['fields'][$field_name];
  5. ?>
#15 24 июля 2021 в 18:35

Так предупреждения нет, но и поля не выводит

var_dump($fields_ordering);  даёт:

array(3) { [0]=> string(5) «phone» [1]=> string(5) «viber» [2]=> string(8) «whatsapp» } 

Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.