1<?php
2
3/*
4 * This file is part of the TYPO3 CMS project.
5 *
6 * It is free software; you can redistribute it and/or modify it under
7 * the terms of the GNU General Public License, either version 2
8 * of the License, or any later version.
9 *
10 * For the full copyright and license information, please read the
11 * LICENSE.txt file that was distributed with this source code.
12 *
13 * The TYPO3 project - inspiring people to share!
14 */
15
16namespace TYPO3\CMS\Backend\View\BackendLayout;
17
18use TYPO3\CMS\Backend\View\BackendLayoutView;
19use TYPO3\CMS\Core\Utility\GeneralUtility;
20
21/**
22 * Class to represent a backend layout.
23 */
24class BackendLayout
25{
26    /**
27     * @var string
28     */
29    protected $identifier;
30
31    /**
32     * @var string
33     */
34    protected $title;
35
36    /**
37     * @var string
38     */
39    protected $description;
40
41    /**
42     * @var string
43     */
44    protected $iconPath;
45
46    /**
47     * @var string
48     */
49    protected $configuration;
50
51    /**
52     * The structured data of the configuration represented as array.
53     *
54     * @var array
55     */
56    protected $structure = [];
57
58    /**
59     * @var array
60     */
61    protected $data;
62
63    /**
64     * @param string $identifier
65     * @param string $title
66     * @param string|array $configuration
67     * @return BackendLayout
68     */
69    public static function create($identifier, $title, $configuration)
70    {
71        return GeneralUtility::makeInstance(
72            static::class,
73            $identifier,
74            $title,
75            $configuration
76        );
77    }
78
79    /**
80     * @param string $identifier
81     * @param string $title
82     * @param string|array $configuration
83     */
84    public function __construct($identifier, $title, $configuration)
85    {
86        $this->setIdentifier($identifier);
87        $this->setTitle($title);
88        if (is_array($configuration)) {
89            $this->structure = $configuration;
90            $this->configuration = $configuration['config'] ?? '';
91        } else {
92            $this->setConfiguration($configuration);
93        }
94    }
95
96    /**
97     * @return string
98     */
99    public function getIdentifier()
100    {
101        return $this->identifier;
102    }
103
104    /**
105     * @param string $identifier
106     * @throws \UnexpectedValueException
107     */
108    public function setIdentifier($identifier)
109    {
110        if (strpos($identifier, '__') !== false) {
111            throw new \UnexpectedValueException(
112                'Identifier "' . $identifier . '" must not contain "__"',
113                1381597630
114            );
115        }
116
117        $this->identifier = $identifier;
118    }
119
120    /**
121     * @return string
122     */
123    public function getTitle()
124    {
125        return $this->title;
126    }
127
128    /**
129     * @param string $title
130     */
131    public function setTitle($title)
132    {
133        $this->title = $title;
134    }
135
136    /**
137     * @return string
138     */
139    public function getDescription()
140    {
141        return $this->description;
142    }
143
144    /**
145     * @param string $description
146     */
147    public function setDescription($description)
148    {
149        $this->description = $description;
150    }
151
152    /**
153     * @return string
154     */
155    public function getIconPath()
156    {
157        return $this->iconPath;
158    }
159
160    /**
161     * @param string $iconPath
162     */
163    public function setIconPath($iconPath)
164    {
165        $this->iconPath = $iconPath;
166    }
167
168    /**
169     * @return string
170     */
171    public function getConfiguration()
172    {
173        return $this->configuration;
174    }
175
176    /**
177     * @param string $configuration
178     */
179    public function setConfiguration($configuration)
180    {
181        $this->configuration = $configuration;
182        $this->structure = GeneralUtility::makeInstance(BackendLayoutView::class)->parseStructure($this);
183    }
184
185    /**
186     * Returns the columns registered for this layout as $key => $value pair where the key is the colPos
187     * and the value is the title.
188     * "1" => "Left" etc.
189     * Please note that the title can contain LLL references ready for translation.
190     * @return array
191     */
192    public function getUsedColumns(): array
193    {
194        return $this->structure['usedColumns'] ?? [];
195    }
196
197    /**
198     * @return array
199     */
200    public function getData()
201    {
202        return $this->data;
203    }
204
205    /**
206     * @param array $data
207     */
208    public function setData(array $data)
209    {
210        $this->data = $data;
211    }
212
213    public function setStructure(array $structure)
214    {
215        $this->structure = $structure;
216    }
217
218    public function getStructure(): array
219    {
220        return $this->structure;
221    }
222
223    public function getColumnPositionNumbers(): array
224    {
225        return $this->structure['__colPosList'];
226    }
227}
228