ODTPHP и сегменты

я использую библиотека odt-php чтобы настроить .odt шаблон с личными данными.

Я в настоящее время застрял во время 6 учебник, где я хочу дублировать строку таблицы.

Код работает нормально, когда я использую имя сегмента по умолчанию: articles

$app = $odf->setSegment('articles');
foreach ($listing_app as $element)
{
$app->descrApp($element['descr']);
$app->refApp($element['ref']);
$app->merge();
}
$odf->mergeSegment($app);

Но когда я хочу заменить / отредактировать / создать новый сегмент с другим именем (здесь test, Это не работает

Fatal error: Uncaught exception 'OdfException' with message ''test' segment not found in the document'

Код точно такой же

$app = $odf->setSegment('test');
foreach ($listing_app as $element)
{
$app->descrApp($element['descr']);
$app->refApp($element['ref']);
$app->merge();
}
$odf->mergeSegment($app);

И у меня есть эти строки в моем .odt :

[!-- BEGIN row.test --] {descrApp} {refApp} [!-- END row.test --]

Я попытался скопировать / вставить из онлайн-учебника, просто изменив имя сегмента. И я тоже пытался все переписать. Кажется, ничего не работает.

Я также попытался экспортировать мой template.odt как xml и, кажется, ничего не напортачить

<informaltable frame="all">
<tgroup cols="3"><tbody><row><entry><para/></entry><entry><para/></entry><entry><para/></entry></row><row><entry><para>[!-- BEGIN row.articles --]{descrApp}</para></entry><entry><para>{refApp}</para></entry><entry><para/><para/><para>[!-- END row.articles --]</para></entry></row></tbody></tgroup>
</informaltable>

редактировать

Я обнаружил, что ошибка исходит от этой функции

public function setSegment($segment)
{
if (array_key_exists($segment, $this->segments)) {
return $this->segments[$segment];
}
// $reg = "#\[!--\sBEGIN\s$segment\s--\]<\/text:p>(.*?)<text:p\s.*>\[!--\sEND\s$segment\s--\]#sm";
$reg = "#\[!--\sBEGIN\s$segment\s--\](.*?)\[!--\sEND\s$segment\s--\]#smU";
if (preg_match($reg, html_entity_decode($this->contentXml), $m) == 0) {
throw new OdfException("'$segment' segment not found in the document");
}
$this->segments[$segment] = new Segment($segment, $m[1], $this);
return $this->segments[$segment];
}

Я не знаю достаточно о регулярных выражениях, но вы думаете, это может быть не в курсе?

0

Решение

Проблема в основном не вызвана odtPhp!
Проблема вызвана тем, как вы модифицируете файл odt шаблона. Как только вы редактируете метку строки в шаблонном документе в (более новом) open / libreoffice, он добавляет в него некоторые нежелательные форматы:

Оригинальный код:

[!-- BEGIN row.articles --]

Новый код:

[!-- BEGIN row.<text:span text:style-name="T4">articles</text:span> --]

Самый простой способ — переписать весь заполнитель.
В качестве альтернативы вы можете сделать следующее:

  1. Измените файл шаблона, как вы хотели.
  2. Распакуйте файл odt (это простой zip-файл)
  3. Удалите эти нежелательные теги вручную снова в текстовом редакторе (файл: content.xml)
  4. Снова упакуйте файлы в zip-файл и переименуйте его обратно в .odt.

Дополнительные примечания:

В качестве теста я ослабил детектор тегов в функции setSegment чтобы все еще стрелять как хотел:

$reg = "#\[!--\sBEGIN\s(.*?)$segment(.*?)\s--\](.*?)\[!--\sEND\s(.*?)$segment(.*?)\s--\]#smU";

Как бы то ни было, это может привести к ложным срабатываниям и позже к ошибке в библиотеке.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]