Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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;$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?
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.
>
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 _
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?
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
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++){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>";
}echo "[".$j."]";
if ($j = $iCellsPerRow - ($iItems % $iCellsPerRow)) {
echo "[".$j."] </div>";
}
}
}
}
É um trocinho de nada... Mais não vira Uff!
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>');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>';if($iItems!=$iCellsPerRow){
echo '</div>';
}
}
}
Jesus.Não, amigo! Era fora do [inline]for (...) {...}[/inline]
Fiz assim:
////
$linha = 0;
$pagina = 1;
$linhas_por_pagina = 3;
$iCellsPerRow = 3;
$iItems = 16;
echo "<hr><hr>";
for ($i=1; $i <=$iItems; $i++){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>';if($iItems!=$iCellsPerRow){
echo '</div>';
}
}
}
Tenho que conseguir pelos menos 20 paginas com 3 conteúdo cada. Tem alguma forma melhor???
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();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!
>
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;
}
Abra o DIV da página sempre que o contador for 0
$result = range(1, 9); // consulta retornou 9 linhas
while (FALSE !== ($row = simula_mysql_fetch_row($resultado)) {