Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Alinhamento de campo no PDF Designer Boa noite pessoal. Criei um PDF no Studio com o Designer, ficou do jeito que eu queria. Só queria acertar dois detalhes: 1 - Alinhar os campos de valores a direita 2 - Exibir o texto de alguns campos ao invés do ID. Obrigado antecipadamente. ...
CM
Alinhamento de campo no PDF Designer  
Boa noite pessoal.
Criei um PDF no Studio com o Designer, ficou do jeito que eu queria.
Só queria acertar dois detalhes:

1 - Alinhar os campos de valores a direita
2 - Exibir o texto de alguns campos ao invés do ID.


Obrigado antecipadamente.


<$php


function onGenerate()
{
try
{
// open a transaction with database 'samples'
TTransaction::open('zeromeia');

// load all customers
$repository = new TRepository('OrdemServico');
$criteria = new TCriteria;
$OrdemServico = $repository->load($criteria);

$data = $this->form->getData();
$this->form->validate();

$designer = new TPDFDesigner;
$designer->fromXml('app/reports/Orcamento.pdf.xml');
$designer->replace('{Id_os}', $data->Id_os );
$designer->replace('{DataAbertura}', $data->DataAbertura);
$designer->replace('{Hora_OS}', $data->Hora_OS);
$designer->replace('{Atendente}', utf8_decode($data->Atendente));
$designer->replace('{status_id}', utf8_decode($data->status_id)); // trazer o texto ao invés do id
$designer->replace('{Cliente_id}', utf8_decode($data->Cliente_id)); // trazer o texto ao invés do id
$designer->replace('{DataVencimento}', $data->DataVencimento);
$designer->replace('{LocalServico}', utf8_decode($data->LocalServico));
$designer->replace('{Setor}', utf8_decode($data->Setor)); // trazer o texto ao invés do id
$designer->replace('{TempoExecucao}', $data->TempoExecucao);
$designer->replace('{TituloServico}', utf8_decode($data->TituloServico));
$designer->replace('{Servico}', utf8_decode($data->Servico));
$designer->replace('{Valor_Inicial}', $data->Valor_Inicial); // este campo a direita
$designer->replace('{Desconto}', $data->Desconto); // este campo a direita
$designer->replace('{Acrescimos}', $data->Acrescimos); // este campo a direita
$designer->replace('{ValorTotal}', $data->ValorTotal); // este campo a direita


$designer->generate();



if ($OrdemServico)
{
foreach ($OrdemServico as $OrdemServico)
{
$designer->gotoAnchorX('');


// cabeçalho
$designer->Image('zeromeia.com/apps/zeromeia/app/images/ZeroMeia_640x286.jpg',20,18,-300);
$designer->SetY(75);
$designer->SetFont('Arial', '', 18);
$designer->setFontColorRGB( '#000000' );
$designer->SetxY(50,86);
$designer->SetFont('Arial', '', 10);
$designer->setFontColorRGB( '#000000' );
$designer->Cell(0, 10, utf8_decode('www.zeromeia.com'),0,0,'L');


// rodapé
$designer->SetY(-12);
$designer->SetFont('Arial', '', 8);
$designer->setFontColorRGB( '#000000' );
$designer->Cell(590, 10, utf8_decode('Pág. ').$designer->PageNo().' de {nb}',0,0,'R');
$designer->SetY(-12);
$designer->Cell(122, 10, utf8_decode('Zero Meia Tecnologia © 2018 '),0,0,'R');
$designer->SetY(-12);
$designer->Cell(340,10,utf8_decode("Impresso em ".date("d/m/Y H:i:s"."")),0,1,'R');
$designer->SetY(-12);
$designer->Cell(410,10,utf8_decode(" - ".TSession::getValue('username')),0,1,'R'); //nome do usuário

// grid background

}
}

$file = 'app/output/OrdemServico.pdf';

if (!file_exists($file) OR is_writable($file))
{
$designer->save($file);
parent::openFile($file);
}
else
{
throw new Exception(_t('Permission denied') . ': ' . $file);
}

// new TMessage('info', 'Relatório gerado. Por favor, habilite os popups no seu navegador.');

// close the transaction
TTransaction::close();
}
catch (Exception $e) // in case of exception
{
new TMessage('error', 'Error ' . $e->getMessage());
TTransaction::rollback();
}
}
?>

Curso completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto Quero me inscrever agora!

Comentários (7)


NR

Para alinhar campos a direita você pode usar a função Cell. Um de seus parâmetros corresponde ao alinhamento desejado. Então a ideia seria usar uma âncora para posicionar no local correto e em seguida usar a função Cell.

Para exibir a descrição, desde que haja a associação entre os modelos:
adianti.com.br/framework_files/tutor/index.php?class=AssociationView
CM

Olá Nataniel, obrigado por sua resposta.
Para alinhar com Cell eu sei como fazer, o problema é que estou usando o replace porquê só assim consigo chamar um único registro.
Se eu usar o Cell o sistema exibe todos os registros.

Para exibir o texto ao invés do id eu consigo fazer nas grids normalmente, mas no pdf usando replace não estou conseguido.
Ainda estou engatinhando no Adianto.
Obrigado pela ajuda.
CM

A parte do alinhamento consegui resolver usando a Cell, ficou legal.
Mas a parte pra trazer o exto ao invés do ID está difícil, já fiz de todas as formas e não vai.
Uso em todas as grids o mesmo procedimento e funciona perfeitamente, mas no PDF tá brabo!
Fiz assim:

$designer->Cell(80, 10, $data->Cliente_id->cliente->descricao, 0, 0, 'L');
CM

Boa noite.
Alguém para dar uma força?
Obrigado
NR

A função getData por padrão retorna um objeto genérico contendo as informações do formulário, dessa forma não é possível usar as associações. Mas é possível informar o tipo de classe:
  1. <?php
  2. $data $this->form->getData('OrdemServico');
  3. ?>

Se o campo Cliente_id estiver preenchido no formulário:
  1. <?php
  2. $designer->Cell(8010$data->cliente->descricao00'L');
  3. ?>

Achei o código um pouco confuso, qual a ideia de usar o foreach? Você não está trabalhando com uma ordem de serviço por vez?
CM

Obrigado Nataniel.
Show de bola essa dica. Funcionou perfeitamente.
Na verdade eu já havia reformulado todo o código do PDF. Está mais limpo e menos confuso.
Inclusive já havia removido o foreach também.

Ficou assim.
Obrigado pela ajuda amigo.

  1. <?php
  2.  function onGenerate()
  3.     {
  4.         try
  5.         {
  6.             // open a transaction with database 'samples'
  7.             TTransaction::open('zeromeia');
  8.             
  9.             // load all customers
  10.             $repository = new TRepository('OrdemServico');
  11.             $criteria   = new TCriteria;
  12.             $OrdemServico $repository->load($criteria);
  13.             
  14.             $data $this->form->getData('OrdemServico'); 
  15.             $this->form->validate();
  16.           
  17.             $designer = new TPDFDesigner;
  18.             $designer->fromXml('app/reports/Orcamento.pdf.xml');
  19.             $designer->generate();
  20.             $fill TRUE;                                    
  21.            
  22.             
  23.             $designer->gotoAnchorX('');
  24.             $designer->SetXY(530,72);
  25.             $designer->SetFont('Arial''B'18);
  26.             $designer->Cell(30,10$data->Id_os01'R');
  27.             $designer->SetFont('Arial'''10);
  28.             
  29.             $designer->SetXY(16,136);
  30.             $designer->Cell(20,10DateTime::createFromFormat('Y-m-d'$data->DataAbertura)->format'd/m/Y' )); 
  31.             
  32.             $designer->SetXY(148,136);
  33.             $designer->Cell(20,10$data->Hora_OS01'L');
  34.             
  35.             $designer->SetXY(256,136);
  36.             $designer->Cell(30,10utf8_decode($data->Atendente), 01'L');
  37.             
  38.             $designer->SetXY(432,136);
  39.             $designer->Cell(30,10utf8_decode($data->Status->descricao), 00'L'); 
  40.             
  41.             $designer->SetXY(16,190);
  42.             $designer->Cell(30010utf8_decode($data->Cliente->descricao), 00'L');
  43.             
  44.             $designer->SetXY(432,190);
  45.             $designer->Cell(20,10DateTime::createFromFormat('Y-m-d'$data->DataVencimento)->format'd/m/Y' ));
  46.             
  47.             $designer->SetXY(16,245);
  48.             $designer->Cell(20010utf8_decode($data->LocalServico), 01'L');
  49.             $designer->SetXY(246,245);
  50.             $designer->Cell(180,10utf8_decode($data->Setor->descricao), 01'L');
  51.             
  52.             $designer->SetXY(432,245);
  53.             $designer->Cell(30,10$data->TempoExecucao01'L');
  54.             
  55.             $designer->SetXY(16,300);
  56.             $designer->Cell(40010utf8_decode($data->TituloServico), 01'L');
  57.             
  58.             $designer->SetXY(16,360);
  59.             $designer->MultiCell(55010utf8_decode($data->Servico), 01'L');
  60.                         
  61.             $designer->SetXY(60,655);
  62.             $designer->Cell(8010number_format((double)$data->Valor_Inicial2',''.'), 00'R');
  63.             $designer->Cell(13210number_format((double)$data->Desconto2',''.'), 00'R');
  64.             $designer->Cell(14010number_format((double)$data->Acrescimos2',''.'), 00'R');
  65.             
  66.             $designer->SetXY(90,655);
  67.             $designer->SetFont('Arial''B'13);
  68.             $designer->Cell(47510number_format((double)$data->ValorTotal,2',''.'), 00'R');
  69.             $designer->SetXY(100,760);
  70.             $designer->SetFont('Arial'''10);
  71.             $designer->Cell(90,10$data->Setor->descricao01'C');
  72.                                 
  73.             // cabeçalho
  74.             $designer->Image('http://zeromeia.com/apps/zeromeia/app/images/ZeroMeia_640x286.jpg',20,18,-300);
  75.             $designer->SetY(75);
  76.             $designer->SetFont('Arial'''18);
  77.             $designer->setFontColorRGB'#000000' );
  78.             $designer->SetxY(50,86);
  79.             $designer->SetFont('Arial'''10);
  80.             $designer->setFontColorRGB'#000000' );
  81.             $designer->Cell(010utf8_decode('www.zeromeia.com'),0,0,'L');
  82.                                                              
  83.                                                              
  84.             // rodapé
  85.             $designer->SetY(-12);
  86.             $designer->SetFont('Arial'''8);
  87.             $designer->setFontColorRGB'#000000' ); 
  88.             $designer->Cell(59010utf8_decode('Pág. ').$designer->PageNo().' de {nb}',0,0,'R');                                         
  89.             $designer->SetY(-12);
  90.             $designer->Cell(12210utf8_decode('Zero Meia Tecnologia © 2018 '),0,0,'R'); 
  91.             $designer->SetY(-12);
  92.             $designer->Cell(340,10,utf8_decode("Impresso em ".date("d/m/Y H:i:s"."")),0,1,'R');
  93.             $designer->SetY(-12);
  94.             $designer->Cell(410,10,utf8_decode(" - ".TSession::getValue('username')),0,1,'R'); //nome do usuário
  95.                                 
  96.             // grid background
  97.             $fill = !$fill;
  98.             
  99.             
  100.             $file 'app/output/OrdemServico.pdf';
  101.             
  102.             if (!file_exists($file) OR is_writable($file))
  103.             {
  104.                 $designer->save($file);
  105.                 parent::openFile($file);
  106.             }
  107.             else
  108.             {
  109.                 throw new Exception(_t('Permission denied') . ': ' $file);
  110.             }
  111.             
  112.            // new TMessage('info', 'Relatório gerado. Por favor, habilite os popups no seu navegador.');
  113.             
  114.             // close the transaction
  115.             TTransaction::close();
  116.         }
  117.         catch (Exception $e// in case of exception
  118.         {
  119.             new TMessage('error''<b>Error</b> ' $e->getMessage());
  120.             TTransaction::rollback();
  121.         }
  122.     }
  123. ?>

CM

O único campo que não retorna nem a pau é o Setor.
Todos os outros estão retornando corretamente.

Na Model eu coloquei o código assim:

  1. <?php
  2. // Busca Clientes
  3.     public function get_cliente() 
  4.     { 
  5.     if (empty($this->cliente)) 
  6.     $this->descricao = new Clientes($this->Cliente_id); 
  7.     
  8.     return $this->descricao
  9.     }            
  10.     
  11.  // Busca Status
  12.     public function get_status() 
  13.     { 
  14.     if (empty($this->status)) 
  15.     $this->descricao = new StatusOs($this->status_id); 
  16.     
  17.     return $this->descricao
  18.     }        
  19. // Busca Setor
  20.     public function get_setor() 
  21.     { 
  22.     if (empty($this->setor)) 
  23.     $this->descricao = new Setores($this->setor_id); 
  24.     
  25.     return $this->descricao
  26.     }        
  27. ?>