설명 없음

FormField.php 5.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?php
  2. /**
  3. * This file is part of PHPWord - A pure PHP library for reading and writing
  4. * word processing documents.
  5. *
  6. * PHPWord is free software distributed under the terms of the GNU Lesser
  7. * General Public License version 3 as published by the Free Software Foundation.
  8. *
  9. * For the full copyright and license information, please read the LICENSE
  10. * file that was distributed with this source code. For the full list of
  11. * contributors, visit https://github.com/PHPOffice/PHPWord/contributors.
  12. *
  13. * @link https://github.com/PHPOffice/PHPWord
  14. * @copyright 2010-2014 PHPWord contributors
  15. * @license http://www.gnu.org/licenses/lgpl.txt LGPL version 3
  16. */
  17. namespace PhpOffice\PhpWord\Writer\Word2007\Element;
  18. use PhpOffice\PhpWord\Element\FormField as FormFieldElement;
  19. use PhpOffice\PhpWord\Shared\XMLWriter;
  20. /**
  21. * FormField element writer
  22. *
  23. * Note: DropDown is active when document protection is set to `forms`
  24. *
  25. * @since 0.12.0
  26. * @link http://www.datypic.com/sc/ooxml/t-w_CT_FFData.html
  27. * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
  28. */
  29. class FormField extends Text
  30. {
  31. /** @const int Length of filler when value is null */
  32. const FILLER_LENGTH = 30;
  33. /**
  34. * Write element.
  35. *
  36. * @return void
  37. */
  38. public function write()
  39. {
  40. $xmlWriter = $this->getXmlWriter();
  41. $element = $this->getElement();
  42. if (!$element instanceof FormFieldElement) {
  43. return;
  44. }
  45. $type = $element->getType();
  46. $instructions = array('textinput' => 'FORMTEXT', 'checkbox' => 'FORMCHECKBOX', 'dropdown' => 'FORMDROPDOWN');
  47. $instruction = $instructions[$type];
  48. $writeFormField = "write{$type}";
  49. $name = $element->getName();
  50. if ($name === null) {
  51. $name = $type . $element->getElementId();
  52. }
  53. $value = $element->getValue();
  54. if ($value === null) {
  55. $value = str_repeat(' ', self::FILLER_LENGTH);
  56. }
  57. $this->startElementP();
  58. $xmlWriter->startElement('w:r');
  59. $xmlWriter->startElement('w:fldChar');
  60. $xmlWriter->writeAttribute('w:fldCharType', 'begin');
  61. $xmlWriter->startElement('w:ffData');
  62. $xmlWriter->writeElementBlock('w:enabled', 'w:val', 1);
  63. $xmlWriter->writeElementBlock('w:name', 'w:val', $name);
  64. $xmlWriter->writeElementBlock('w:calcOnExit', 'w:val', 0);
  65. $this->$writeFormField($xmlWriter, $element);
  66. $xmlWriter->endElement(); // w:ffData
  67. $xmlWriter->endElement(); // w:fldChar
  68. $xmlWriter->endElement(); // w:r
  69. $xmlWriter->startElement('w:r');
  70. $this->writeFontStyle();
  71. $xmlWriter->startElement('w:instrText');
  72. $xmlWriter->writeAttribute('xml:space', 'preserve');
  73. $xmlWriter->writeRaw("{$instruction}");
  74. $xmlWriter->endElement();// w:instrText
  75. $xmlWriter->endElement(); // w:r
  76. $xmlWriter->startElement('w:r');
  77. $this->writeFontStyle();
  78. $xmlWriter->writeElementBlock('w:fldChar', 'w:fldCharType', 'separate');
  79. $xmlWriter->endElement(); // w:r
  80. $xmlWriter->startElement('w:r');
  81. $this->writeFontStyle();
  82. $xmlWriter->startElement('w:t');
  83. $xmlWriter->writeAttribute('xml:space', 'preserve');
  84. $xmlWriter->writeRaw($value);
  85. $xmlWriter->endElement(); // w:t
  86. $xmlWriter->endElement(); // w:r
  87. $xmlWriter->startElement('w:r');
  88. $this->writeFontStyle();
  89. $xmlWriter->writeElementBlock('w:fldChar', 'w:fldCharType', 'end');
  90. $xmlWriter->endElement(); // w:r
  91. $this->endElementP(); // w:p
  92. }
  93. /**
  94. * Write textinput.
  95. *
  96. * @link http://www.datypic.com/sc/ooxml/t-w_CT_FFTextInput.html
  97. * @param \PhpOffice\PhpWord\Shared\XMLWriter $xmlWriter
  98. * @param \PhpOffice\PhpWord\Element\FormField $element
  99. * @return void
  100. */
  101. private function writeTextInput(XMLWriter $xmlWriter, FormFieldElement $element)
  102. {
  103. $default = $element->getDefault();
  104. $xmlWriter->startElement('w:textInput');
  105. $xmlWriter->writeElementBlock('w:default', 'w:val', $default);
  106. $xmlWriter->endElement();
  107. }
  108. /**
  109. * Write checkbox.
  110. *
  111. * @link http://www.datypic.com/sc/ooxml/t-w_CT_FFCheckBox.html
  112. * @param \PhpOffice\PhpWord\Shared\XMLWriter $xmlWriter
  113. * @param \PhpOffice\PhpWord\Element\FormField $element
  114. * @return void
  115. */
  116. private function writeCheckBox(XMLWriter $xmlWriter, FormFieldElement $element)
  117. {
  118. $default = $element->getDefault() ? 1 : 0;
  119. $value = $element->getValue();
  120. if ($value == null) {
  121. $value = $default;
  122. }
  123. $value = $value ? 1 : 0;
  124. $xmlWriter->startElement('w:checkBox');
  125. $xmlWriter->writeElementBlock('w:sizeAuto', 'w:val', '');
  126. $xmlWriter->writeElementBlock('w:default', 'w:val', $default);
  127. $xmlWriter->writeElementBlock('w:checked', 'w:val', $value);
  128. $xmlWriter->endElement();
  129. }
  130. /**
  131. * Write dropdown.
  132. *
  133. * @link http://www.datypic.com/sc/ooxml/t-w_CT_FFDDList.html
  134. * @param \PhpOffice\PhpWord\Shared\XMLWriter $xmlWriter
  135. * @param \PhpOffice\PhpWord\Element\FormField $element
  136. * @return void
  137. */
  138. private function writeDropDown(XMLWriter $xmlWriter, FormFieldElement $element)
  139. {
  140. $default = $element->getDefault();
  141. $value = $element->getValue();
  142. if ($value == null) {
  143. $value = $default;
  144. }
  145. $entries = $element->getEntries();
  146. $xmlWriter->startElement('w:ddList');
  147. $xmlWriter->writeElementBlock('w:result', 'w:val', $value);
  148. $xmlWriter->writeElementBlock('w:default', 'w:val', $default);
  149. foreach ($entries as $entry) {
  150. $xmlWriter->writeElementBlock('w:listEntry', 'w:val', $entry);
  151. }
  152. $xmlWriter->endElement();
  153. }
  154. }