я использую библиотека 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];
}
Я не знаю достаточно о регулярных выражениях, но вы думаете, это может быть не в курсе?
Проблема в основном не вызвана odtPhp!
Проблема вызвана тем, как вы модифицируете файл odt шаблона. Как только вы редактируете метку строки в шаблонном документе в (более новом) open / libreoffice, он добавляет в него некоторые нежелательные форматы:
Оригинальный код:
[!-- BEGIN row.articles --]
Новый код:
[!-- BEGIN row.<text:span text:style-name="T4">articles</text:span> --]
Самый простой способ — переписать весь заполнитель.
В качестве альтернативы вы можете сделать следующее:
Дополнительные примечания:
В качестве теста я ослабил детектор тегов в функции setSegment
чтобы все еще стрелять как хотел:
$reg = "#\[!--\sBEGIN\s(.*?)$segment(.*?)\s--\](.*?)\[!--\sEND\s(.*?)$segment(.*?)\s--\]#smU";
Как бы то ни было, это может привести к ложным срабатываниям и позже к ошибке в библиотеке.
Других решений пока нет …