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();
}
}
?>
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();
}
}
?>
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
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.
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:
Boa noite.
Alguém para dar uma força?
Obrigado
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:
Se o campo Cliente_id estiver preenchido no formulário:
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?
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.
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: