odt — это zip-архив который, кроме всего прочего содержит content.xml — непосредственно текст, добавьте в него теги вида ${variabe} и скормите его smarty — вот и шаблон.
я чего-то не понимаю про ваш шаблон? мне казалось у вас примерно такой код должен быть
file_put_contents('file.otd', str_replace($arraySearch, $arrayReplace, file_get_contents('file.odt')))
Идея хорошая, и наверное даже применимая, но ODT документ — это ZIP архив, чтобы в нем подставить переменные — надо сначала распаковать, потом в content.xml сделать подстановку и обратно все запаковать.