Отображение данных в строке в столбце 1, затем в строках в столбце 2 и т. д.

Во-первых, я нашел это решение (ColdFusion — отображение строк в виде столбцов), которое БУДЕТ исправить мой проблема, если бы я мог использовать table, но я не могу, так как это должно быть отзывчивым. Однако клиенту не понравились адаптивные таблицы. Они действительно, действительно предпочли бы, чтобы столбцы отображались так, чтобы пользователю нужно было только прокручивать вверх и вниз, а не вверх вниз и вбок, чтобы сторона.

Мне нужна помощь в преобразовании таблицы в bootstrap <div>. Я знаю основы: пропускаем стол, tr равняется div class="row", а td равняется div class="col-sm-*" вещам. Однако, более конкретно, я не уверен в логике, которую следует использовать для преобразования решения SO, приведенного выше, и в том, как применить его к моим потребностям.

Используя Lucee вместе с Bootstrap v3, я пытаюсь заполнить «сетку», но мне нужно заполнить строки в столбце1 перед заполнением столбца2.

1|10|20|30|40  
2|11|21|31|41  
3|12|22|32|42  
4|13|23|33|43

Приведенный ниже фрагмент кода принадлежит @travis, и я не беру на себя ответственность за него

<cfset cols = 5>
<!--- get the number of rows so you know what record to display at the top of the next row. for example if our query contains "a,b,c,d,e,f,g,h,i,j,k,l,m" (13 elements) it will produce 3 totalrows--->
<cfset totalRows = ceiling(qMyQuery.RecordCount / cols)>
<!--- set inital record to 1 "output" is the actual cell of the query --->
<cfset output = 1>
<!--- Create table --->
<table width = "100%" border="0" align="center" cellpadding="2" cellspacing = "2">  
<!--- loop through the rows.  This loop will run 3 times in this example --->
    <cfloop from = "1" to = "#totalRows#" index = "thisRow">
    <tr>
        <!--- this loop will run 5 times in times in this example --->
        <cfloop from = "1" to = "#cols#" index = "thisCol">
        <!--- the width in the table cell will dynamicaly calculated to evenly distribute the cells. in this example if cols = 5 100/5 will make the cells 20% of the table --->
        <td width = "<cfoutput>#numberformat((100/cols), 99)#</cfoutput>%" align="center" nowrap style = "border: 1px solid #ccc;">
            <!--- Check current record with the record count, this will be used to display data or an empty cell --->
            <cfif output lte qMyQuery.recordCount>
                <cfoutput>#qMyQuery.Mon[output]#</cfoutput>
            <cfelse>
            <!--- use <br> to display an empty cell --->
                <br>
            </cfif>
            <!--- increment counter to the next record in this example if we started on the first cell of the first row it would be 1(a), then 4(d), then 7(g) and so on if this was the firs cell on the second row it would be 2(b), 5(e), 8(h), continue... --->
            <cfset output = output + totalRows>
        </td>
        </cfloop>
        <!--- this little bit tells where to start the next row. if we just finished the first row output would be 2(b) --->
        <cfset output = thisRow + 1>
    </tr>
    </cfloop>
</table>

и это моя попытка сделать то же самое с помощью бутстрапа:

<!-- what I'm working with -->
<cfset cols = 2>
<!-- get the number of rows so you know what record to display at the top of the next row. for example if our query contains "a,b,c,d,e,f,g,h,i,j,k,l,m" (13 elements) it will produce 3 totalrows-->
<cfset totalRows = ceiling(qMyQuery.RecordCount / cols)>
<!--- set inital record to 1 "output" is the actual cell of the query --->
<cfset output = 1>
<!--- Create table --->
<div class="row">
    <div class="col-sm-12">
    <!--- loop through the rows.  This loop will run 3 times in this example --->
        <cfloop from = "1" to = "#totalRows#" index = "thisRow">
            <div class="row">
                <!--- this loop will run 5 times in this example --->
                <cfloop from = "1" to = "#cols#" index = "thisCol">
                    <div class="col-xs-3" style="border:1px solid red">
                        <cfif output lte qMyQuery.recordCount>
                            <cfoutput>#qMyQuery.mon[output]#</cfoutput>
                        <cfelse>
                            <br>
                        </cfif>
                        <cfset output = output + totalRows>
                    </div>
                </cfloop>
                <cfset output = thisRow + 1>
            </div>
        </cfloop>
    </div>
</div>

Тем не менее, вывод моей работы просто отображает все на одной странице полной ширины (встроенный стиль границы: 1px сплошной красный цвет позволяет увидеть, что производит код). Хотя это для ColdFusion, я полагаю, что логика цикла будет такой же для PHP.

Любые советы, хитрости, советы или, желательно, решения для этого?


person HPWD    schedule 06.05.2017    source источник
comment
Bootstrap 3.x использует базу 12 для своей системы сетки. Если комментарий в приведенном выше коде правильный; Цикл будет выполнен 5 раз, что создаст пять разделов col-sx-3, что в сумме даст 15. Другая потенциальная проблема заключается в том, что col-sx-3 (в цикле) может быть опечаткой. Стандартными классами сетки являются col-xs-, col-sm-, cols-md-и col-lg-. Конечно, col-sx-3 может быть определяемым пользователем классом...   -  person Scott Jibben    schedule 07.05.2017
comment
SO не позволил бы мне опубликовать свой код, пока я не исправлю некоторые отступы и что-то еще, я забыл, что это было. Я знаком с сеткой (люблю ее). sx была опечаткой, я исправлю это в коде. Что касается количества столбцов, в настоящее время установлено значение 2, которое должно быть динамическим в зависимости от устройства, используемого для просмотра страницы. Я оставил это в коде, чтобы помочь объяснить, где были переменные и значения, но, оглядываясь назад, считаю, что вместо этого это могло добавить путаницы.   -  person HPWD    schedule 07.05.2017
comment
Я подумал о том, чтобы сделать несколько быстрых математических вычислений, чтобы получить количество возвращаемых записей (должно быть значительно меньше 100), и разделить его на количество столбцов, которые мне понадобятся, а затем выполнить запрос запросов для каждого столбца данных.   -  person HPWD    schedule 07.05.2017
comment
Мне не нравится схема <div class="row">, затем <div class="col-sm-12">, затем <div class="row">. Bootstrap действительно не работает таким образом.   -  person James A Mohler    schedule 07.05.2017
comment
@JamesAMohler Вы уверены? getbootstrap.com/css/#grid-nesting предоставляет пример вложения - или это не то, что вы имели в виду? Если нет, то можно уточнить, пожалуйста?   -  person HPWD    schedule 08.05.2017
comment
Я бы подумал об использовании JavaScript здесь. Просто позвольте ColdFusion вывести данные в скрытую область страницы, а JavaScript переупорядочит их.   -  person Phillip Senn    schedule 08.05.2017
comment
У вас есть пример кода, пост или ссылка, которой вы можете поделиться?   -  person HPWD    schedule 08.05.2017


Ответы (2)


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

Для этой реализации список никогда не будет превышать 75 записей, 99% времени будет использоваться на планшете или более крупном устройстве и будет использоваться пользователями для установки флажков. Также будет опция «выбрать все», но она не включена в этот ответ — это история пользователя на потом.

Я запускаю три запроса (запуская один запрос, а затем запрос запросов), один собирает первое количество записей XX, а второе количество записей XX, XX для третьего набора записей. Я передаю переменную для QoQ, которая будет определять, сколько строк будет отображаться, чтобы в каждом столбце отображались некоторые данные.

Тогда вывод выглядит так (извините, но я никогда не смогу получить правильное форматирование в SO):

`    <div class="container">
    <div class="row">
        <div class="col-xs-3 col-xs-offset-1">
            <cfoutput query="colum1">
                <label><input type="checkbox"> #id# #mon#</label><br/>
            </cfoutput>
        </div>
        <div class="col-xs-3">
            <cfoutput query="colum2">
                <label><input type="checkbox"> #id# #mon#</label><br/>
            </cfoutput>
        </div>
        <div class="col-xs-3">
            <cfoutput query="colum3">
                <label><input type="checkbox"> #id# #mon#</label><br/>
            </cfoutput>
        </div>
    </div>
</div>`
person HPWD    schedule 08.05.2017
comment
Из любопытства, что QoQ покупает вам по сравнению с cfoutput start/endRow? - person Leigh; 09.05.2017
comment
Отличный вопрос. Насколько я понимаю, я могу кэшировать исходный запрос (который имеет менее 100 записей), а затем извлекать 25 или около того записей из кэшированной памяти (кеширование кэшированных?). Я запускал его с кэшированием и без него, с QoQ и без него (я знаю, что это может быть дорого). Разница в производительности была незначительной, QoQ был немного быстрее. Возможно, не менее важно, чтобы код был читабельным. РЖУ НЕ МОГУ. - person HPWD; 09.05.2017
comment
Если данные не меняются часто, то кэширование - неплохая идея, но не следование тому, как QoQ помогает с исходной проблемой вывода данных в определенном порядке, т.е. вниз и поперек вместо поперек и вниз. - person Leigh; 10.05.2017
comment
@Leigh ГЛАВНЫЙ запрос упорядочен по идентификатору, затем по пн. QoQA извлечет первые 25 записей из MAIN, QoQB извлечет следующие 25 из MAIN, а затем QoQC извлечет оставшиеся 25 из MAIN. Каждый набор находится в порядке, так что я получаю свой алфавитный список в каждой колонке. QoQA передает значение для получения 25 записей, QoQB и QoQC делают то же самое. Затем я вывожу QoQA в ColumnA, как определено cfoutput query=colum1, cfoutput query=colum2, cfoutput query=colum3. Это помогает? - person HPWD; 10.05.2017
comment
QoQ может помочь не так сильно, как я первоначально думал. Я предположил, что могу передать CFC необходимое количество записей в качестве дополнительного аргумента... Переосмысление этого подхода. - person HPWD; 10.05.2017
comment
Подход QoQ оказался более эффективным и легко читаемым. - person HPWD; 17.05.2017

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

Я создал суть ColdFusion из вашего примера: https://trycf.com/gist/cec79b0028728c9ec370e3bb8a05991f/lucee5?theme=monokai

Единственные изменения, которые я сделал, заключались в том, чтобы создать объект запроса с данными вашего примера и изменить количество столбцов (cols) на 4, что хорошо сочетается с системой компоновки сетки Bootstrap 12. Вам потребуется немного изменить 5 столбца.

Когда вы запускаете этот код, он показывает один столбец данных, как вы говорите. Но это потому, что классы Bootstrap не загружены. Когда я копирую вывод, созданный этим кодом, в Bootply, он правильно отображается в четырех столбцах: http://www.bootply.com/a0dF7NKw9V

введите здесь описание изображения

person Miguel-F    schedule 08.05.2017
comment
Во-первых, спасибо за усилия. Код, который я разместил, работает, но для того, чтобы мой код работал, A) вам нужно жестко закодировать количество столбцов B) если размер браузера изменен, столбцы не будут складываться и C) список не будет состоять из чисел, это будет текст различной длины с флажком, сопровождающим текст. ХТН. На настольном компьютере у нас может быть 4 столбца, на планшете — 3 столбца, а на устройстве меньшего размера — один столбец (поэтому я не могу заранее жестко запрограммировать переменную col. - person HPWD; 08.05.2017
comment
Это то, что Bootstrap делает для вас. В основном вам нужно указать классы для каждого устройства, которое вы хотите. Поэтому вместо того, чтобы просто указать <div class="col-xs-3">, вам нужно указать что-то вроде <div class="col-xs-12 col-sm-4 col-md-3">. Это означает отображение 1 столбца для устройств xs, 3 столбцов для устройств sm и 4 столбцов для устройств md. Это должно заставить вас двигаться в правильном направлении. Сложная часть будет пытаться отображать четное количество столбцов каждый раз. - person Miguel-F; 08.05.2017
comment
количество столбцов каждый раз и есть проблема - LOL. Я думаю, что у меня есть работающее решение, которое я опубликую вскоре после того, как закончу преобразование псевдокода в реальный код. - person HPWD; 08.05.2017