运行Joomla的网站具有特定于不同产品类别的模板布局。在这种情况下,我们正在查看产品类别A的布局。该产品类别布局应按每行3个产品的网格组织产品。
PHP / Jquery代码获取该类别的产品,然后具有将产品分配给“ subrow”类的逻辑,直到其中有3个产品,然后它将创建下一个子行并将其分配给该子行。我不是PHP开发人员,所以我想获得一些意见。
问题:
以下是此逻辑的PHP / Jquery代码。 有人看到任何明显的问题会导致其不遵循每行3个产品的方式吗?
callAPI("productlines/by/subcategory")
.done(function(data) {
var moulding = data['Product Category A']
var maxPerRow = 3;
var matMap = {};
for (var i=0; i < moulding.length; i++) {
if(i%2===0) {
jQuery('<div/>')
.addClass('material-row-'+i)
}
var matgroup = jQuery('.material-rows');
var subrow = matgroup.children(".subrow").last();
if(subrow.length == 0) { subrow = jQuery("<div/>").addClass("subrow").attr("data-row",0).appendTo(matgroup); }
if(!matMap[0]) matMap[0] = 0;
if(++matMap[0] > maxPerRow){
// console.log("subrow",subrow[0],"is full! making new row");
subrow = jQuery("<div/>").addClass("subrow").appendTo(matgroup).attr("data-row",1+parseInt(subrow.attr("data-row")));
matMap[0]=0;
}
popProducts(moulding[i],subrow[0])
}
});
答案 0 :(得分:3)
您的代码中的问题是,当您添加新行时,将在其中添加一个元素,因为添加元素的函数在调用之后被调用,但是您在计数器(matMap
)中设置了0个元素,但是应该为1(matMap[0] = 1;
)
if(++matMap[0] > maxPerRow){
// console.log("subrow",subrow[0],"is full! making new row");
subrow = jQuery("<div/>").addClass("subrow").appendTo(matgroup).attr("data-row",1+parseInt(subrow.attr("data-row")));
matMap[0]=1;
}
简单的例子:
var moulding = [1, 2, 3, 4, 5, 6, 7, 8];
var maxPerRow = 3;
var matMap = {};
for (var i = 0; i < moulding.length; i++) {
if (i % 2 === 0) {
jQuery('<div/>')
.addClass('material-row-' + i)
}
var matgroup = jQuery('.material-rows');
var subrow = matgroup.children(".subrow").last();
if (subrow.length == 0) {
subrow = jQuery("<div/>").addClass("subrow").attr("data-row", 0).appendTo(matgroup);
}
if (!matMap[0]) matMap[0] = 0;
if (++matMap[0] > maxPerRow) {
// console.log("subrow",subrow[0],"is full! making new row");
subrow = jQuery("<div/>").addClass("subrow").appendTo(matgroup).attr("data-row", 1 + parseInt(subrow.attr("data-row")));
matMap[0] = 1;
}
jQuery("<div/>").append("Element: " + moulding[i]).addClass("moulding-col").appendTo(subrow[0]);
// popProducts(moulding[i],subrow[0])
}
.subrow {
display: flex;
}
.moulding-col {
margin: 5px;
border: 1px solid black;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="material-rows" />
与您的问题无关,但是代码非常丑陋,您应该考虑对其进行改进。我会稍微改善您的功能,以便您可以检查更好的做法(使用let,const,不要在DOM中搜索您已经拥有的元素(例如,table
),使用更多描述性变量等。 )。
const moulding = [1, 2, 3, 4, 5, 6, 7, 8];
const maxItemsPerRow = 3;
const table = $('.material-rows');
for (let i = 0; i < moulding.length; i++) {
let row = table.children(".subrow").last();
if (!(i % maxItemsPerRow)) {
row = $("<div/>").addClass("subrow").attr("data-row", parseInt(i / maxItemsPerRow)).appendTo(table);
}
$("<div/>").append("Element: " + moulding[i]).addClass("moulding-col").appendTo(row);
}