Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

JGD

Como Incrementar contadores.

Recommended Posts

Olá Pessoa,

 

Preciso criar um relatório que gere 03 conteúdo por folha.

 

Então tentei criar dinamicamente no código php o comando:

 

echo “<div style=’"page-break-before: always;’></div>”;

 

 

 

Mais o comportamento não fica igual em todos os navegadores.

 

Então estou jogando o conteúdo em div’s para depois selecionar a div_<?=xis?> correspondente via jQuery e assim simular uma paginação.

 

Então se são 3 tabelas por página... Para a 1ª página ficaria assim:

 

 

 

...
$sql = "SELECT campos FROM tabela WHERE tipo='$tipo'";
$result = mysql_query($sql);
$contador =0;
$pagina=1;
$i;
while($row = mysql_fetch_row($result)){
$contador++;

...

If($pagina==1){
echo “<div id=’pagina_’”. $i .”>”;
}

..conteúdo 1..
..conteúdo 2..
..conteúdo 3..



if($contador==3){
  $pagina++;
  echo "</div>";
  $contador =0;
 }   

...

}

 

Mas como faço para incrementar os contadores... já que o conteúdo é dinâmico dentro do select?

 

Alguem tem algum sugestão?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Abra o DIV da página sempre que o contador for 0

 

 

$result = range(1, 9); // consulta retornou 9 linhas
 
function simula_mysql_fetch_row($resultado) {
    $retornar = current($resultado);
    next($resultado);
    return $retornar;
}
 
$linha = 0;
$pagina = 1;
$linhas_por_pagina = 3;
 
while (FALSE !== ($row = simula_mysql_fetch_row($resultado)) {
    if (!$linha) {
        printf('<div id="pagina_%i">', $pagina);
    }
    $linha += 1;
 
...
 
    if ($linha % $linhas_por_pagina) {
        $linha = 0;
        $pagina += 1;
        echo '</div>';
    }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo Evandro,

 

Mais o trecho:

 

$result = range(1, 9); // consulta retornou 9 linhas function 
simula_mysql_fetch_row($resultado) {    $retornar = 
current($resultado);    
next($resultado);    return $retornar;}

 

 

 

É só um recurso para simular um select. Correto? (nunca vi este arranjo).

Daí, na prática ficaria assim:

 

$sql = "SELECT campos FROM tabela WHERE tipo='$tipo'";
$result = mysql_query($sql);
while($row = mysql_fetch_row($result)){

if (!$linha) {        
echo "<div id='pagina_'".$pagina."'>";    
}  
 
$linha += 1; 
...Conteúdo 1...
...Conteúdo 2...
...Conteúdo 3...
     
if ($linha % $linhas_por_pagina){        
 $linha = 0;        
 $pagina +=1;         
 echo '</div>';
 }

}

 

 

É isso? Obrigado pela dica.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo Evandro,

 

Mais o trecho:

 



$result = range(1, 9); // consulta retornou 9 linhas function 
simula_mysql_fetch_row($resultado) {    $retornar = 
current($resultado);    
next($resultado);    return $retornar;}

 

 

 

É só um recurso para simular um select. Correto? (nunca vi este arranjo).

Daí, na prática ficaria assim:

 



$sql = "SELECT campos FROM tabela WHERE tipo='$tipo'";
$result = mysql_query($sql);
while($row = mysql_fetch_row($result)){

if (!$linha) {        
echo "<div id='pagina_'".$pagina."'>";    
}  
 
$linha += 1; 
...Conteúdo 1...
...Conteúdo 2...
...Conteúdo 3...
     
if ($linha % $linhas_por_pagina){        
 $linha = 0;        
 $pagina +=1;         
 echo '</div>';
 }

}

 

 

É isso? Obrigado pela dica.

 

Isso, garoto. É que estou sem ter como testar aqui.

 

E a linha [inline]echo "<div id='pagina_'".$pagina."'>";[/inline] tem um apóstrofo sobrando depois do _

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Evandro,

 

Respondi por falta de tempo. Perdão.

 

Olha só tá rolando a separação... No entando, a pagina não está trazendo 3 tabelas por pagina e sim uma por pagina.

Estou tentando matar.

Outra coisa. Tentei rodar o seu arranjo lá do ragen. Não passa... dá : "PHP Parse error: parse error" Será que é versão do php?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha só tá rolando a separação... No entando, a pagina não está trazendo 3 tabelas por pagina e sim uma por pagina.

Posta pra gente como ficou o markup gerado

 

Outra coisa. Tentei rodar o seu arranjo lá do ragen. Não passa... dá : "PHP Parse error: parse error" Será que é versão do php?

Relaxa, 101% de certeza que eu errei em alguma coisa

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu baseado na sua lógica "claro"...

 

Estou fazendo como abaixo... Mais sempre a ultima div naão fecha a tag... Ai dá pau no resto..

 

 

 

////
$linha = 0;
$pagina = 1;
$linhas_por_pagina = 3;
$iCellsPerRow = 3;
$iItems = 7;

for ($i=1; $i <=$iItems; $i++){
if (($i % $iCellsPerRow) == "1"){
echo " <div id='pagina_".$pagina."' style='border:solid 1px 
#ff0000;'>Pagina: ".$pagina;
}
$linha = $linha+1;
echo " ".$i." ";

if (($i % $iCellsPerRow) == 0){
$linha = 0;
$pagina = $pagina+1;
echo "</div>";
}
if (($i % $iCellsPerRow) > 0){
for ($j=1; $j <= (($i % $iCellsPerRow) - $iCellsPerRow) ; $j++){


echo "[".$j."]";


if ($j = $iCellsPerRow - ($iItems % $iCellsPerRow)) {
echo "[".$j."] </div>";
}
}
}
}

 

É um trocinho de nada... Mais não vira Uff!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou fazendo como abaixo... Mais sempre a ultima div naão fecha a tag... Ai dá pau no resto..

É porque a quantidade de células da última linha não preenche a linha toda.

for ($i=1; $i <=$iItems; $i++){
...
}

$i % $iCellsPerRow and print('</div>');

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo! fiz como você indicou...

 

 

 

if(($i % $iCellsPerRow) < $iItems){
echo '</div>';
}

 

 

Blz! Qdo.atendente a condição... Do contrário Coloca 2 </div></div>... Bah!



Gente, Quase...

 

Tá indo 1 ao 5 certinho...

 


Pagina: 1: 1| 2| 3|
Pagina: 2: 4| 5|

 

Aí quando cologo o 6ª... dobra denovo "</div></div>" o fechamento da div. .

 

 

 

 

$linha = 0;
$pagina = 1;
$linhas_por_pagina = 3;
$iCellsPerRow = 3;
$iItems = 6;
echo "<hr><hr>";
for ($i=1; $i <=$iItems; $i++){
if (($i % $iCellsPerRow) == 1){
echo " <div id='pagina_".$pagina."' style='border:solid 1px 
#ff0000;'>Pagina: ".$pagina.":";
}
$linha = $linha+1;
echo " ".$i."|";

if (($i % $iCellsPerRow) == 0){
$linha = 0;
$pagina = $pagina+1;
echo "</div>";
}

}

if($iItems==$iCellsPerRow){

}else{

if(($i % $iCellsPerRow) < $iItems){
echo '</div>';
}else{

if($iItems!=$iCellsPerRow){
echo '</div>';
}
}
}

Jesus.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz assim:

 

 

 

////
$linha = 0;
$pagina = 1;
$linhas_por_pagina = 3;
$iCellsPerRow = 3;
$iItems = 16;
echo "<hr><hr>";
for ($i=1; $i <=$iItems; $i++){
if (($i % $iCellsPerRow) == 1){
echo " <div id='pagina_".$pagina."' style='border:solid 1px 
#ff0000;'>Pagina: ".$pagina.":";
}


$linha = $linha+1;
echo " ".$i."|";

if (($i % $iCellsPerRow) == 0){
$linha = 0;
$pagina = $pagina+1;
echo "</div>";
}

}

if(($i % $iCellsPerRow)==1){

}else{

if(($i % $iCellsPerRow) < $iItems){
echo '</div>';
}else{
if($iItems!=$iCellsPerRow){
echo '</div>';
}
}
}

 

Tenho que conseguir pelos menos 20 paginas com 3 conteúdo cada. Tem alguma forma melhor???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, eu até tenho uma forma melhor

 

 



<?php

interface Drawable
{
    public function __toString();
}

trait CompositeCapability
{
    private $children = array();

    public function addChildNode(Drawable $node)
    {
        $this->children[] = $node;
    }

    protected function drawChildren()
    {
        return implode(PHP_EOL, $this->children) . PHP_EOL;
    }
}

trait EnumerateCapability
{
    protected $number;

    public function __construct($number)
    {
        $this->number = intval($number);
    }
}

abstract class CompositeEnumerateDrawable implements Drawable
{
    use EnumerateCapability;
    use CompositeCapability;

    protected $template;

    public function __toString()
    {
        return sprintf($this->template, $this->number, $this->drawChildren());
    }
}

class Page extends CompositeEnumerateDrawable
{
    protected $template = '<div id="page_%d">%s</div>';

    public function __destruct()
    {
        echo $this;
    }
}

class Line extends CompositeEnumerateDrawable
{
    protected $template = '<div class="line_%d">%s</div>';
}

class Column extends CompositeEnumerateDrawable
{
    protected $template = '<span class="column_%d">%s</span>';
    private $content;

    public function __construct($number, $content = '')
    {
        parent::__construct($number);
        $this->setContent($content);
    }

    public function setContent($content)
    {
        $this->content = strval($content);
    }

    public function __toString()
    {
        return sprintf($this->template, $this->number, $this->content);
    }
}

$columns_per_line = 3;
$lines_per_page = 3;

// Substituir pelo mysql_query
$result = range(1, 16);

// apenas para simulação
function _mysql_fetch_row($resource)
{
    static $data;
    if ($data !== $resource) {
        $data = $resource;
    }
    $row = current($data);
    next($data);
    return $row;
}

// Agora a brincadeira começa!
$items_per_page = $lines_per_page * $columns_per_line;

$i = 0;
$page = new Page(1);
$page->addChildNode($line = new Line(1));

// substituir pelo mysql_fetch_row original
while (false !== ($row = _mysql_fetch_row($result))) {
    $line->addChildNode(new Column($i % $columns_per_line + 1, $row));
    $i += 1;
    if (!($i % ($items_per_page))) {
        $page = new Page($i / $items_per_page + 1);
    }
    if (!($i % $columns_per_line)) {
        $l = $i / $lines_per_page % $lines_per_page + 1;
        $page->addChildNode($line = new Line($l));
    }
}

 

 

Eu tentei facilitar ao máximo, mas acho que acabei dificultando.

Independente da forma como você vai fazer, uma matemática bem simples se aplica...

 

 

A propósito, o nome Composite me lembrou de usar a implementação padrão DOM do PHP. Fica mais elegante:

 

 

<?php

$dom = new DOMDocument();

$columns_per_line = 3;
$lines_per_page = 3;

// Substituir pelo mysql_query
$result = range(1, 16);

// apenas para simulação
function _mysql_fetch_row($resource)
{
    static $data;
    if ($data !== $resource) {
        $data = $resource;
    }
    $row = current($data);
    next($data);
    return $row;
}

// Agora a brincadeira começa!
$items_per_page = $lines_per_page * $columns_per_line;

$i = 0;
$dom->appendChild($page = $dom->createElement('div'));
$page->setAttribute('id', 'page_' . 1);

$page->appendChild($line = $dom->createElement('div'));
$line->setAttribute('class', 'line_' . 1);

// substituir pelo mysql_fetch_row original
while (false !== ($row = _mysql_fetch_row($result))) {
    $column = $dom->createElement('span', $row);
    $column->setAttribute('class', 'column_' . ($i % $columns_per_line + 1));
    $line->appendChild($column);
    $i += 1;
    if (!($i % ($items_per_page))) {
        $dom->appendChild($page = $dom->createElement('div'));
        $page->setAttribute('id', 'page_' . ($i / $items_per_page + 1));
    }
    if (!($i % $columns_per_line)) {
        $l = $i / $lines_per_page % $lines_per_page + 1;
        $page->appendChild($line = $dom->createElement('div'));
        $line->setAttribute('class', 'line_' . $l);
    }
}

$dom->formatOutput = true;
echo $dom->saveHTML();

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que é isso!? Evandro. Ajudo bastante sim...

 

Com arranjo acima consegui chargar até a página 20....

 

 

 

<div id='pagina_1' style='border:solid 1px #ff0000;'>Pagina: 1: 1| 2| 
3|</div>
<div id='pagina_2' style='border:solid 1px #ff0000;'>Pagina: 2: 4| 5| 
6|</div>
<div id='pagina_3' style='border:solid 1px #ff0000;'>Pagina: 3: 7| 8| 
9|</div>
...
<div id='pagina_20' style='border:solid 1px #ff0000;'>Pagina: 20: 58| 
59| 60|</div>

 

 

 

Mais estou achando que o esforço não vai lçevar a nada porque

sem rodo 60 parcelas... No caso, são carnês tipo recibo que estou fazendo... Seleciono (select) Pagina1...

roda preview... Manda para impressora folha 1. Vai bem até 5... Aí vai na página 15. Simplemente não faz nada.

Quer dizer, No I.E até "fufou" algumas vezes... No FF e Chrome Nada.

 

Será que o volume está estourando o buffer ou aguma capacidade do navegador? O carnezinho tem layout parecido com boleto bancário... Estou tentando esta parada de paginação porque se mando imprimir direto... Os carnês, a medida que vão imprimindo.. vou comendo ou empurando os demais no meio do paple... Desalinhado completamente os ultimos..

Fora o pulo da 'quebra-de-pagina' ´que é diferente entre os navegadores,,, Ha tentei tb via pdf a mesma coisa.

 

Impressão tipo "etiqueta" sempre dá problema né? Já passou alguma necessidade ou sistuação parecida?

 

De qualquer forma obrigado mesmo cara!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou tentando esta parada de paginação porque se mando imprimir direto... Os carnês, a medida que vão imprimindo.. vou comendo ou empurando os demais no meio do paple... Desalinhado completamente os ultimos..

Fora o pulo da 'quebra-de-pagina' ´que é diferente entre os navegadores,,, Ha tentei tb via pdf a mesma coisa.

 

Impressão tipo "etiqueta" sempre dá problema né? Já passou alguma necessidade ou sistuação parecida?

 

http://forum.imasters.com.br/forum/79-css-xml-xhtml-html/

 

Basta você definir o tamanho dos elementos em medidas de página

 

 

.page {
    height: 23cm;
    width: 21cm;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.