3 namespace wcf\acp\form
;
5 use wcf\data\IStorableObject
;
6 use wcf\data\package\Package
;
7 use wcf\data\package\PackageCache
;
8 use wcf\data\template\group\TemplateGroup
;
9 use wcf\data\template\group\TemplateGroupNodeTree
;
10 use wcf\data\template\Template
;
11 use wcf\data\template\TemplateAction
;
12 use wcf\form\AbstractFormBuilderForm
;
13 use wcf\system\cache\builder\TemplateGroupCacheBuilder
;
14 use wcf\system\database\util\PreparedStatementConditionBuilder
;
15 use wcf\system\exception\IllegalLinkException
;
16 use wcf\system\form\builder\container\FormContainer
;
17 use wcf\system\form\builder\data\processor\CustomFormDataProcessor
;
18 use wcf\system\form\builder\data\processor\VoidFormDataProcessor
;
19 use wcf\system\form\builder\field\HiddenFormField
;
20 use wcf\system\form\builder\field\SingleSelectionFormField
;
21 use wcf\system\form\builder\field\SourceCodeFormField
;
22 use wcf\system\form\builder\field\TextFormField
;
23 use wcf\system\form\builder\field\validation\FormFieldValidationError
;
24 use wcf\system\form\builder\field\validation\FormFieldValidator
;
25 use wcf\system\form\builder\IFormDocument
;
26 use wcf\system\template\TemplateEngine
;
30 * Shows the form for adding new templates.
33 * @copyright 2001-2024 WoltLab GmbH
34 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
36 class TemplateAddForm
extends AbstractFormBuilderForm
41 public $activeMenuItem = 'wcf.acp.menu.link.template.add';
46 public $neededPermissions = ['admin.template.canManageTemplate'];
51 public $objectActionClass = TemplateAction
::class;
56 public $objectEditLinkController = TemplateEditForm
::class;
59 * id of copied template
65 * copied template object
68 public Template
$copiedTemplate;
71 protected function createForm()
75 $this->form
->appendChildren([
76 FormContainer
::create('general')
78 SingleSelectionFormField
::create('templateGroupID')
79 ->label('wcf.acp.template.group')
80 ->options(new TemplateGroupNodeTree(), true)
82 new FormFieldValidator('sharedTemplate', function (SingleSelectionFormField
$formField) {
83 $templateGroupID = $formField->getSaveValue();
84 $templateGroup = TemplateGroupCacheBuilder
::getInstance()->getData(
88 \assert
($templateGroup instanceof TemplateGroup
);
90 $tplNameFormField = $formField->getDocument()->getNodeById('templateName');
91 \assert
($tplNameFormField instanceof TextFormField
);
92 $tplName = $tplNameFormField->getSaveValue();
95 TemplateEngine
::isSharedTemplate($tplName)
96 && $templateGroup->templateGroupFolderName
!== '_wcf_shared/'
98 $formField->addValidationError(
99 new FormFieldValidationError(
101 'wcf.acp.template.group.error.shared'
105 !TemplateEngine
::isSharedTemplate($tplName)
106 && $templateGroup->templateGroupFolderName
=== '_wcf_shared/'
108 $formField->addValidationError(
109 new FormFieldValidationError(
111 'wcf.acp.template.group.error.notShared'
117 TextFormField
::create('templateName')
119 ->label('wcf.global.name')
121 new FormFieldValidator('fileName', function (TextFormField
$formField) {
122 $tplName = $formField->getSaveValue();
123 if (!\
preg_match('/^[a-z0-9_\-]+$/i', $tplName)) {
124 $formField->addValidationError(
125 new FormFieldValidationError('invalid', 'wcf.acp.template.name.error.invalid')
131 new FormFieldValidator('unique', function (TextFormField
$formField) {
132 $templateGroupIDFormField = $formField->getDocument()->getNodeById('templateGroupID');
133 \assert
($templateGroupIDFormField instanceof SingleSelectionFormField
);
135 $conditionBuilder = new PreparedStatementConditionBuilder();
136 $conditionBuilder->add('templateName = ?', [$formField->getSaveValue()]);
137 $conditionBuilder->add('templateGroupID = ?', [
138 $templateGroupIDFormField->getSaveValue()
141 if (isset($this->copiedTemplate
)) {
142 $conditionBuilder->add(
143 '(packageID = ? OR application = ?)',
144 [$this->copiedTemplate
->packageID
, $this->copiedTemplate
->application
]
147 $conditionBuilder->add('packageID = ?', [1]);
150 if ($this->formAction
=== 'edit') {
151 $conditionBuilder->add('templateID <> ?', [$this->formObject
->getObjectID()]);
154 $sql = "SELECT COUNT(*)
155 FROM wcf" . WCF_N
. "_template
156 " . $conditionBuilder;
157 $statement = WCF
::getDB()->prepareStatement($sql);
158 $statement->execute($conditionBuilder->getParameters());
160 if ($statement->fetchSingleColumn()) {
161 $formField->addValidationError(
162 new FormFieldValidationError(
164 'wcf.acp.template.name.error.notUnique'
171 FormContainer
::create('source')
172 ->label('wcf.acp.template.source')
174 SourceCodeFormField
::create('templateSource')
176 ->label('wcf.acp.template.source'),
178 HiddenFormField
::create('copy')
179 ->value($this->copy
),
182 $this->form
->getDataHandler()
184 new CustomFormDataProcessor(
186 static function (IFormDocument
$document, array $parameters) {
187 $parameters['source'] = $parameters['data']['templateSource'];
191 function (IFormDocument
$document, array $data, IStorableObject
$object) {
192 \assert
($object instanceof Template
);
193 $data['templateSource'] = $object->getSource();
199 ->addProcessor(new VoidFormDataProcessor('copy'))
200 ->addProcessor(new VoidFormDataProcessor('templateSource'));
202 if ($this->formAction
=== 'create') {
203 $this->form
->getDataHandler()
205 new CustomFormDataProcessor(
207 function (IFormDocument
$document, array $parameters) {
208 if (isset($this->copiedTemplate
)) {
209 $parameters['data']['application'] = $this->copiedTemplate
->application
;
211 $sql = "SELECT packageID
212 FROM wcf" . WCF_N
. "_template
213 WHERE templateName = ?
214 AND templateGroupID IS NULL";
215 $statement = WCF
::getDB()->prepareStatement($sql);
216 $statement->execute([
217 $parameters['data']['templateName']
219 $packageID = $statement->fetchSingleRow() ?
: 1;
221 $parameters['data']['application'] = Package
::getAbbreviation(
222 PackageCache
::getInstance()->getPackage($packageID)->package
234 public function readParameters()
236 parent
::readParameters();
237 if (!empty($_REQUEST['copy'])) {
238 $this->copy
= \
intval($_REQUEST['copy']);
239 $this->copiedTemplate
= new Template($this->copy
);
240 if (!$this->copiedTemplate
->templateID
) {
241 throw new IllegalLinkException();
247 public function readData()
251 if ($_POST === [] && isset($this->copiedTemplate
)) {
252 $this->form
->getNodeById('templateSource')->value($this->copiedTemplate
->getSource());
253 $this->form
->getNodeById('templateName')->value($this->copiedTemplate
->templateName
);