В документации https://dev.1c-bitrix.ru/api_d7/bitrix/documentgenerator/customization.php описана возможность наследования от уже существующих провайдеров. Но совсем не ясно, как потом подключить наследованный провайдер при построении документа. В моем случае, есть необходимость добавить несколько новые полей, которые можно было бы использовать в шаблонах документов для "счетов".
Добавил MyDataProvider extends Invoice
В нем переопределил getFields с нужными мне дополнительными полями
Подписался на событие onGetDataProviderList. И поля провайдера даже отображаются в админке, при просмотре всех полей.
Но как сделать так, чтобы загружались значения для этих полей, при формировании документа для счета? Ведь при формировании передается dataProviderClass = Invoice, а все остальные источники отфильтровываются. Т.е. в шаблон для счета попадают только данные из Invoice (DataProvider). Неужели ловить событие onBeforeProcessDocument? В чем секрет?
Никита Мех написал: как можно в шаблон подставить содержимое из другого docx файла
Штатно - никак.
Если есть много времени - можно попробовать. Но только руками, уже после создания документа. Каким-то образом помечать нужное место, самостоятельно готовить родительские теги, вычленять теги из другого файла и всё это склеивать.
А есть какое-то событие, на которое можно было бы подписаться и из которого был бы доступ к сформированному docx файлу? Подпихнуть кусок другого docx файла я смогу через свою реализацию DocxXml и его метода printValue.
Но тут именно кусок document.xml получается запихнуть вместо placeholder, а как быть с _rels/document.xml и картинками из media моего внутреннего шаблона? Хочу сделать так, чтобы можно было вместо простого placeholder вставить целиком содержимое другого docx файла (без сложных слияний стилей и т.д.). Вижу решение как-то уже в готовый docx добавить картинку и перенести связь на нее, но на каком этапе можно получить доступ к файлу?
Вариант с собственной реализацией DocxXml - правильный.
Посмотрите класс Docx. Там идет обмен данными о мета-данных изображений через возвращаемые значения. Это клас-контейнер для всего docx файла, а в docxxml обрабатываются xml-файлы из архива с текстом.
В вашем случае помимо вставки готового куска xml придется - удостовериться, что он вставится корректно (если у вас там картинки, скорее всего, надо будет подняться на несколько уровней тегов вверх по иерархии, чтобы оно склеилось) - распарсить ваш кусок вставляемого xml в поисках картинок и нумерованных/ненумерованных списков. Добавить информацию о них в $this->arrayImageValues и $this->numberingIds - проверить, что всё работает.
Документации по этому делу нет, придётся смотреть исходники и дебажить. Формат обмена данными между классами там не очень прозрачный