0
I have the following table on my website, and today, it is static (not upgradable by Cmss). It has more lines than this image, but I only took a piece to illustrate.
Today, in my database, I have these 3 plans (ACO, ACO FIT and ACO Modular) registered in a table called "system_plans". Each plan has ONE product registered in "system_product" and interconnected by a table called "system_plano_product". Inside each product, there are the modules that, in the image above, are illustrated aligned in the left column. These modules are registered in a table called "system_module" and interconnected in the product through a table called "system_product_module".
I need to assemble this image table by consulting the information in the bank. I managed, but due to the high number of consultations, in 80% of the times it gives TIMEOUT.
So I think there’s something wrong with the logic I’ve built. I’d like tips on how to proceed!
$divTabela = "";
$listaHead01 = "";
$listaHead02 = "";
$listaModulo = "";
$listaFoot = "";
/ * Traz os planos pra montar a tabela
$objPlano = new Plano();
$objPlano->plaAtivo = "S";
$objPlano->plaExcluido = "N";
$resultadoPlano = $objPlano->load(false, "plaValor DESC");
if(!empty($resultadoPlano)){
// * Inicia os objetos
$objPlanoProduto = new PlanoProduto();
$objProdutoModulo = new ProdutoModulo();
$objModulo = new Modulo();
$objModulo->modAtivo = "S";
$objModulo->modExcluido = "N";
$arrayProdutoId = array();
// * Loop de planos
foreach($resultadoPlano as $plano){
$valorPlano = (!empty($plano['plaValor'])) ? "A partir de<br><span>R$".number_format($plano['plaValor'],2,",",".")."</span> mensais<br><small>+ Taxa de ativação da licença e tempo mínimo de contrato: 12 meses</small>" : "Consulte";
// * Headings
$listaHead01 .= "<th width=\"20%\">".$plano['plaTitulo']."</th>";
$listaHead02 .= "<th>".$valorPlano."</th>";
// * Footers
$listaFoot .= "<td><a class=\"btn-arq\" href=\"/produto/".$plano['plaAlias']."\">Mais detalhes</a></td>";
// * Precisamos saber agora qual ícone irá em cada TD
// * Para isso, traremos primeiro o produto do plano $i
// * Com o produto definido, podemos saber quais módulos cada produto tem disponível
$objPlanoProduto->plaId = $plano['plaId'];
$resultadoPlanoProduto = $objPlanoProduto->load();
if(!empty($resultadoPlanoProduto)){
$arrayProdutoId[] = $resultadoPlanoProduto[0]['proId'];
}
}
// * Traz a lista de módulos
$resultadoModulo = $objModulo->load();
if(!empty($resultadoModulo)){
foreach($resultadoModulo as $modulo){
// * Inicia as variáveis
$tdPlano = "";
// * Tbody
// * Pra cada plano, cria uma TD
for($i = 0; $i < count($resultadoPlano); $i++){
$iconeCheck = "";
// * Agora, trazemos os módulos do produto
$objProdutoModulo->proId = $arrayProdutoId[$i];
$objProdutoModulo->modId = $modulo['modId'];
$resultadoProdutoModulo = $objProdutoModulo->load(true);
if(!empty($resultadoProdutoModulo)){
// * Verifica se o produto é modular
if($resultadoPlano[$i]['plaValor'] > 0){
$iconeCheck = "<i class=\"fa fa-check\"></i>";
}
else{
$iconeCheck = "<i data-toggle=\"tooltip\" title=\"Item opcional. Consulte adição.\" class=\"fa fa-question\"></i>";
}
}
// * Monta no template
$tdPlano .= "<td>".$iconeCheck."</td>";
}
$listaModulo .= "
<tr>
<td>".$modulo['modTitulo']."</td>
".$tdPlano."
</tr>";
}
}
$divTabela = "
<table class=\"tabelaPreco table table-bordered table-striped\">
<thead>
<tr>
<th width=\"20%\" style=\"background:#f3f3f3\"></th>
".$listaHead01."
</tr>
<tr>
<th style=\"background:#f3f3f3\"></th>
".$listaHead02."
</tr>
</thead>
<tbody>
".$listaModulo."
</tbody>
<tfoot>
<tr>
<td></td>
".$listaFoot."
</tr>
</tfoot>
</table>";
}
Ever tried to put logs in the middle of the code to know the point that takes the most time?
– Pagotti
@Pagotti the query that is inside the for: $resultsProdutModule = $objProductModule->load(true); This takes longer. But it takes time for the amount of times it is performed, not for its construction itself.
– Maykel Esser
This is bad even because they are two nested loops. In this case I don’t see how to optimize the code pq the bank time is much longer. I think the best is to see if you can optimize the consultation in the bank to do once or at least take from inside the last loop.
– Pagotti