Forum


Replies: 6   Views: 2719
Reemplazar bookmark
Topic closed:
Please note this is an old forum thread. Information in this post may be out-to-date and/or erroneous.
Every phpdocx version includes new features and improvements. Previously unsupported features may have been added to newer releases, or past issues may have been corrected.
We encourage you to download the current phpdocx version and check the Documentation available.

Posted by admin  · 19-01-2017 - 08:03

Hola,

Aunque efectivamente se puede hacer directamente con siblings con DOCXPath, el desarrollador encargado de hacer tu ejemplo, propone una solución que es más sencilla: combinar DOCXPath y los bloques de phpdocx.

Este es un ejemplo práctico:

<?php

require_once 'classes/CreateDocx.inc';

$docx = new CreateDocx();

$docx->addText('$BLOCK_CONTENT_1$');
$docx->addText('Text in a block.');
$docx->addText('$BLOCK_CONTENT_1$');

$docx->addText('Other text.');

$docx->createDocx('output_block');

$docxTemplate = new CreateDocxFromTemplate('output_block.docx');

$content = new WordFragment($docxTemplate, 'document');
$content->addText('New text.', array('fontSize' => 20, 'color' => '#0000ff'));

$referenceNode = array(
    'type' => 'paragraph',
    'ocurrence' => 2,
    'contains' => '$BLOCK_CONTENT_1$',
);
$docxTemplate->insertWordFragment($content, $referenceNode, 'after');

$docxTemplate->deleteTemplateBlock('CONTENT_1');

$docxTemplate->createDocx('output_result');

Aunque este ejemplo añade los bloques de manera dinámica, también funciona perfectamente trabajando directamente con templates.

Los pasos generales son:

  1. Rodeas de placeholders de tipo bloque cada contenido a reemplazar (puede ser uno, dos o más contenidos).
  2. Con insertWordFragment de DOCXPath añades el nuevo wordFragment tras el segundo placeholder del bloque a reemplazar.
  3. Con deleteTemplateBlock eliminas el bloque deseado.

Estos mismos pasos los puedes seguir para todos los bloques y te da la misma flexibilidad que con DOCXPath pero de manera más flexible gracias a utilizar bloques.

También comentarte que al utilizar atributos en DOCXPath es necesario indicar el namespace del atributo en caso de usarlo. Por ejemplo:

'attributes' => array(
    'w:name' => "chapter_module_$chapter[id]"
)

Saludos.