danielebarchiesi@2
|
1 <?php
|
danielebarchiesi@2
|
2
|
danielebarchiesi@2
|
3 /**
|
danielebarchiesi@2
|
4 * A QuickSet object is an unrendered Quicktabs instance, essentially just a
|
danielebarchiesi@2
|
5 * container of content items, as defined by its configuration settings and the
|
danielebarchiesi@2
|
6 * array of content items it contains.
|
danielebarchiesi@2
|
7 */
|
danielebarchiesi@2
|
8 class QuickSet {
|
danielebarchiesi@2
|
9
|
danielebarchiesi@2
|
10 /**
|
danielebarchiesi@2
|
11 * The unique name of the QuickSet object.
|
danielebarchiesi@2
|
12 * This corresponds to the machine name as stored in the database or as defined
|
danielebarchiesi@2
|
13 * in code.
|
danielebarchiesi@2
|
14 * @var string
|
danielebarchiesi@2
|
15 */
|
danielebarchiesi@2
|
16 protected $name;
|
danielebarchiesi@2
|
17
|
danielebarchiesi@2
|
18 /**
|
danielebarchiesi@2
|
19 * The contents array.
|
danielebarchiesi@2
|
20 * An array of objects that implement the QuickContentRenderable interface.
|
danielebarchiesi@2
|
21 * @var array
|
danielebarchiesi@2
|
22 */
|
danielebarchiesi@2
|
23 protected $contents;
|
danielebarchiesi@2
|
24
|
danielebarchiesi@2
|
25 /**
|
danielebarchiesi@2
|
26 * An array of settings controlling the behaviour of the QuickSet object. See
|
danielebarchiesi@2
|
27 * the getDefaultSettings() static function of this class for the full list of
|
danielebarchiesi@2
|
28 * settings.
|
danielebarchiesi@2
|
29 * @var array
|
danielebarchiesi@2
|
30 */
|
danielebarchiesi@2
|
31 protected $settings;
|
danielebarchiesi@2
|
32
|
danielebarchiesi@2
|
33
|
danielebarchiesi@2
|
34 /**
|
danielebarchiesi@2
|
35 * Accessors.
|
danielebarchiesi@2
|
36 */
|
danielebarchiesi@2
|
37
|
danielebarchiesi@2
|
38 public function getName() {
|
danielebarchiesi@2
|
39 return $this->name;
|
danielebarchiesi@2
|
40 }
|
danielebarchiesi@2
|
41
|
danielebarchiesi@2
|
42 public function getContents() {
|
danielebarchiesi@2
|
43 return $this->contents;
|
danielebarchiesi@2
|
44 }
|
danielebarchiesi@2
|
45
|
danielebarchiesi@2
|
46 public function getSettings() {
|
danielebarchiesi@2
|
47 return $this->settings;
|
danielebarchiesi@2
|
48 }
|
danielebarchiesi@2
|
49
|
danielebarchiesi@2
|
50 public function getTitle() {
|
danielebarchiesi@2
|
51 return isset($this->settings['title']) ? $this->translateString($this->settings['title'], 'title') : $this->name;
|
danielebarchiesi@2
|
52 }
|
danielebarchiesi@2
|
53
|
danielebarchiesi@2
|
54 /**
|
danielebarchiesi@2
|
55 * Instantiate, populate and return a QuickSet object wrapped in a renderer.
|
danielebarchiesi@2
|
56 *
|
danielebarchiesi@2
|
57 * @param $name
|
danielebarchiesi@2
|
58 * The unique name (machine name) of the QuickSet instance.
|
danielebarchiesi@2
|
59 *
|
danielebarchiesi@2
|
60 * @param $contents
|
danielebarchiesi@2
|
61 * The array of content items, each one itself an array with at least a 'type'
|
danielebarchiesi@2
|
62 * key, a 'title' key, and the other info necessary for that type.
|
danielebarchiesi@2
|
63 *
|
danielebarchiesi@2
|
64 * @param $renderer
|
danielebarchiesi@2
|
65 * The plugin key for this renderer plugin
|
danielebarchiesi@2
|
66 *
|
danielebarchiesi@2
|
67 * @param $settings
|
danielebarchiesi@2
|
68 * An array of settings determining the behaviour of this QuickSet instance.
|
danielebarchiesi@2
|
69 *
|
danielebarchiesi@2
|
70 */
|
danielebarchiesi@2
|
71 public static function QuickSetRendererFactory($name, $contents, $renderer, $settings) {
|
danielebarchiesi@2
|
72 ctools_include('plugins');
|
danielebarchiesi@2
|
73 if ($class = ctools_plugin_load_class('quicktabs', 'renderers', $renderer, 'handler')) {
|
danielebarchiesi@2
|
74 try {
|
danielebarchiesi@2
|
75 $qs = new self($name, $contents, $settings);
|
danielebarchiesi@2
|
76 }
|
danielebarchiesi@2
|
77 catch (InvalidQuickSetException $e) {
|
danielebarchiesi@2
|
78 watchdog('Quicktabs', $e->getMessage());
|
danielebarchiesi@2
|
79 return NULL;
|
danielebarchiesi@2
|
80 }
|
danielebarchiesi@2
|
81 return new $class($qs);
|
danielebarchiesi@2
|
82 }
|
danielebarchiesi@2
|
83 }
|
danielebarchiesi@2
|
84
|
danielebarchiesi@2
|
85 /**
|
danielebarchiesi@2
|
86 * Returns a reference to an object that implements the QuickContentRenderable
|
danielebarchiesi@2
|
87 * interface.
|
danielebarchiesi@2
|
88 */
|
danielebarchiesi@2
|
89 public static function getContentRenderer($tab) {
|
danielebarchiesi@2
|
90 if ($tab['type'] == 'prerendered') {
|
danielebarchiesi@2
|
91 return new QuickPreRenderedContent($tab);
|
danielebarchiesi@2
|
92 }
|
danielebarchiesi@2
|
93 if ($content = QuickContent::factory($tab['type'], $tab)) {
|
danielebarchiesi@2
|
94 return $content;
|
danielebarchiesi@2
|
95 }
|
danielebarchiesi@2
|
96 return NULL;
|
danielebarchiesi@2
|
97 }
|
danielebarchiesi@2
|
98
|
danielebarchiesi@2
|
99 /**
|
danielebarchiesi@2
|
100 * Static method to retrieve content from an ajax call. This is called by the
|
danielebarchiesi@2
|
101 * quicktabs_ajax() callback in quicktabs.module.
|
danielebarchiesi@2
|
102 */
|
danielebarchiesi@2
|
103 public static function ajaxRenderContent($type, $args) {
|
danielebarchiesi@2
|
104 if ($renderer = self::getContentRenderer(array('type' => $type))) {
|
danielebarchiesi@2
|
105 $output = $renderer->render(FALSE, $args);
|
danielebarchiesi@2
|
106 return !empty($output) ? drupal_render($output) : '';
|
danielebarchiesi@2
|
107 }
|
danielebarchiesi@2
|
108 return '';
|
danielebarchiesi@2
|
109 }
|
danielebarchiesi@2
|
110
|
danielebarchiesi@2
|
111 /**
|
danielebarchiesi@2
|
112 * Ensure sensible default settings for each QuickSet object.
|
danielebarchiesi@2
|
113 */
|
danielebarchiesi@2
|
114 private static function getDefaultSettings() {
|
danielebarchiesi@2
|
115 return array(
|
danielebarchiesi@2
|
116 'title' => '<none>',
|
danielebarchiesi@2
|
117 'style' => 'nostyle',
|
danielebarchiesi@2
|
118 'hide_empty_tabs' => 0,
|
danielebarchiesi@2
|
119 'ajax' => 0,
|
danielebarchiesi@2
|
120 'default_tab' => 0,
|
danielebarchiesi@2
|
121 'options' => array(),
|
danielebarchiesi@2
|
122 );
|
danielebarchiesi@2
|
123 }
|
danielebarchiesi@2
|
124
|
danielebarchiesi@2
|
125 /**
|
danielebarchiesi@2
|
126 * Constructor
|
danielebarchiesi@2
|
127 */
|
danielebarchiesi@2
|
128 public function __construct($name, $contents, $settings) {
|
danielebarchiesi@2
|
129 $this->name = $name;
|
danielebarchiesi@2
|
130 $this->contents = array();
|
danielebarchiesi@2
|
131 foreach ($contents as $key => $item) {
|
danielebarchiesi@2
|
132 // Instantiate a content renderer object and add it to the contents array.
|
danielebarchiesi@2
|
133 if ($renderer = self::getContentRenderer($item)) {
|
danielebarchiesi@2
|
134 $this->contents[$key] = $renderer;
|
danielebarchiesi@2
|
135 }
|
danielebarchiesi@2
|
136 }
|
danielebarchiesi@2
|
137 $default_settings = self::getDefaultSettings();
|
danielebarchiesi@2
|
138 $this->settings = array_merge($default_settings, $settings);
|
danielebarchiesi@2
|
139
|
danielebarchiesi@2
|
140 $this->prepareContents();
|
danielebarchiesi@2
|
141 // Set the default style if necessary.
|
danielebarchiesi@2
|
142 if ($this->settings['style'] == 'default') {
|
danielebarchiesi@2
|
143 $this->settings['style'] = variable_get('quicktabs_tabstyle', 'nostyle');
|
danielebarchiesi@2
|
144 }
|
danielebarchiesi@2
|
145 }
|
danielebarchiesi@2
|
146
|
danielebarchiesi@2
|
147 /**
|
danielebarchiesi@2
|
148 * Returns an ajax path to be used on ajax-enabled tab links.
|
danielebarchiesi@2
|
149 *
|
danielebarchiesi@2
|
150 * @param $index The index of the tab, i.e where it fits into the QuickSet
|
danielebarchiesi@2
|
151 * instance.
|
danielebarchiesi@2
|
152 *
|
danielebarchiesi@2
|
153 * @param $type The type of content we are providing an ajax path for.
|
danielebarchiesi@2
|
154 */
|
danielebarchiesi@2
|
155 public function getAjaxPath($index, $type) {
|
danielebarchiesi@2
|
156 return 'quicktabs/ajax/'. $this->name .'/'. $index . '/'. $type;
|
danielebarchiesi@2
|
157 }
|
danielebarchiesi@2
|
158
|
danielebarchiesi@2
|
159 /**
|
danielebarchiesi@2
|
160 * Translates Quicktabs user-defined strings if the i18n module is
|
danielebarchiesi@2
|
161 * enabled.
|
danielebarchiesi@2
|
162 */
|
danielebarchiesi@2
|
163 public function translateString($string, $type = 'tab', $index = 0) {
|
danielebarchiesi@2
|
164 switch ($type) {
|
danielebarchiesi@2
|
165 case 'tab':
|
danielebarchiesi@2
|
166 $name = "tab:{$this->name}-{$index}:title";
|
danielebarchiesi@2
|
167 break;
|
danielebarchiesi@2
|
168 case 'title':
|
danielebarchiesi@2
|
169 $name = "title:{$this->name}";
|
danielebarchiesi@2
|
170 break;
|
danielebarchiesi@2
|
171 }
|
danielebarchiesi@2
|
172 return quicktabs_translate($name, $string);
|
danielebarchiesi@2
|
173 }
|
danielebarchiesi@2
|
174
|
danielebarchiesi@2
|
175 /**
|
danielebarchiesi@2
|
176 * This method does some initial set-up of the tab contents, such as hiding
|
danielebarchiesi@2
|
177 * tabs with no content if the hide_empty_tabs option is set. It also makes sure
|
danielebarchiesi@2
|
178 * that prerendered contents are never attempted to be loaded via ajax.
|
danielebarchiesi@2
|
179 *
|
danielebarchiesi@2
|
180 * @throws InvalidQuickSetException if there are no contents to render.
|
danielebarchiesi@2
|
181 */
|
danielebarchiesi@2
|
182 protected function prepareContents() {
|
danielebarchiesi@2
|
183 if (!count($this->contents)) {
|
danielebarchiesi@2
|
184 throw new InvalidQuickSetException('There are no contents to render.');
|
danielebarchiesi@2
|
185 }
|
danielebarchiesi@2
|
186 if ($this->settings['hide_empty_tabs'] && !$this->settings['ajax']) {
|
danielebarchiesi@2
|
187 // Check if any tabs need to be hidden because of empty content.
|
danielebarchiesi@2
|
188 $renderable_contents = 0;
|
danielebarchiesi@2
|
189 foreach ($this->contents as $key => $tab) {
|
danielebarchiesi@2
|
190 $contents = $tab->render(TRUE);
|
danielebarchiesi@2
|
191 if (empty($contents)) {
|
danielebarchiesi@2
|
192 // Rather than removing the item, we set it to NULL. This way we retain
|
danielebarchiesi@2
|
193 // the same indices across tabs, so that permanent links to particular
|
danielebarchiesi@2
|
194 // tabs can be relied upon.
|
danielebarchiesi@2
|
195 $this->contents[$key] = NULL;
|
danielebarchiesi@2
|
196 // The default tab must not be a hidden tab.
|
danielebarchiesi@2
|
197 if ($this->settings['default_tab'] == $key) {
|
danielebarchiesi@2
|
198 $this->settings['default_tab'] = ($key + 1) % count($this->contents);
|
danielebarchiesi@2
|
199 }
|
danielebarchiesi@2
|
200 }
|
danielebarchiesi@2
|
201 else {
|
danielebarchiesi@2
|
202 $renderable_contents++;
|
danielebarchiesi@2
|
203 }
|
danielebarchiesi@2
|
204 }
|
danielebarchiesi@2
|
205 if (!$renderable_contents) {
|
danielebarchiesi@2
|
206 throw new InvalidQuickSetException('There are no contents to render.');
|
danielebarchiesi@2
|
207 }
|
danielebarchiesi@2
|
208 }
|
danielebarchiesi@2
|
209 elseif ($this->settings['ajax']) {
|
danielebarchiesi@2
|
210 // Make sure that there is at most 1 prerendered tab and it is the default tab.
|
danielebarchiesi@2
|
211 // Prerendered content cannot be rendered via ajax.
|
danielebarchiesi@2
|
212 $has_prerendered = FALSE; // keep track of whether we have found a prerendered tab.
|
danielebarchiesi@2
|
213 foreach ($this->contents as $key => $tab) {
|
danielebarchiesi@2
|
214 $type = $tab->getType();
|
danielebarchiesi@2
|
215 if ($type == 'prerendered') {
|
danielebarchiesi@2
|
216 if (!$has_prerendered) {
|
danielebarchiesi@2
|
217 $has_prerendered = TRUE;
|
danielebarchiesi@2
|
218 $this->settings['default_tab'] = $key;
|
danielebarchiesi@2
|
219 // In the case of a direct link to a different tab, the 'default_tab'
|
danielebarchiesi@2
|
220 // will be overridden, so we need to make sure it does not attempt
|
danielebarchiesi@2
|
221 // to load a pre-rendered tab via ajax. Turn ajax option off.
|
danielebarchiesi@2
|
222 if ($this->getActiveTab() !== $key) {
|
danielebarchiesi@2
|
223 $this->settings['ajax'] = 0;
|
danielebarchiesi@2
|
224 }
|
danielebarchiesi@2
|
225 }
|
danielebarchiesi@2
|
226 else {
|
danielebarchiesi@2
|
227 // We are on a second custom tab and the ajax option is set, we cannot
|
danielebarchiesi@2
|
228 // render custom tabs via ajax, so we skip out of the loop, set the
|
danielebarchiesi@2
|
229 // ajax option to off, and call the method again.
|
danielebarchiesi@2
|
230 $this->settings['ajax'] = 0;
|
danielebarchiesi@2
|
231 $this->prepareContents();
|
danielebarchiesi@2
|
232 return;
|
danielebarchiesi@2
|
233 }
|
danielebarchiesi@2
|
234 }
|
danielebarchiesi@2
|
235 }
|
danielebarchiesi@2
|
236 }
|
danielebarchiesi@2
|
237 }
|
danielebarchiesi@2
|
238
|
danielebarchiesi@2
|
239 /**
|
danielebarchiesi@2
|
240 * Returns the active tab for a given Quicktabs instance. This could be coming
|
danielebarchiesi@2
|
241 * from the URL or just from the settings for this instance. If neither, it
|
danielebarchiesi@2
|
242 * defaults to 0.
|
danielebarchiesi@2
|
243 */
|
danielebarchiesi@2
|
244 public function getActiveTab() {
|
danielebarchiesi@2
|
245 $active_tab = isset($this->settings['default_tab']) ? $this->settings['default_tab'] : key($this->contents);
|
danielebarchiesi@2
|
246 $active_tab = isset($_GET['qt-' . $this->name]) ? $_GET['qt-' . $this->name] : $active_tab;
|
danielebarchiesi@2
|
247 $active_tab = (isset($active_tab) && isset($this->contents[$active_tab])) ? $active_tab : 0;
|
danielebarchiesi@2
|
248 return $active_tab;
|
danielebarchiesi@2
|
249 }
|
danielebarchiesi@2
|
250 }
|
danielebarchiesi@2
|
251
|
danielebarchiesi@2
|
252 /**
|
danielebarchiesi@2
|
253 * Abstract base class for QuickSet Renderers.
|
danielebarchiesi@2
|
254 *
|
danielebarchiesi@2
|
255 * A renderer object contains a reference to a QuickSet object, which it can
|
danielebarchiesi@2
|
256 * then render.
|
danielebarchiesi@2
|
257 */
|
danielebarchiesi@2
|
258 abstract class QuickRenderer {
|
danielebarchiesi@2
|
259
|
danielebarchiesi@2
|
260 /**
|
danielebarchiesi@2
|
261 * @var QuickSet
|
danielebarchiesi@2
|
262 */
|
danielebarchiesi@2
|
263 protected $quickset;
|
danielebarchiesi@2
|
264
|
danielebarchiesi@2
|
265 /**
|
danielebarchiesi@2
|
266 * Constructor
|
danielebarchiesi@2
|
267 */
|
danielebarchiesi@2
|
268 public function __construct($quickset) {
|
danielebarchiesi@2
|
269 $this->quickset = $quickset;
|
danielebarchiesi@2
|
270 }
|
danielebarchiesi@2
|
271
|
danielebarchiesi@2
|
272 /**
|
danielebarchiesi@2
|
273 * Accessor method for the title.
|
danielebarchiesi@2
|
274 */
|
danielebarchiesi@2
|
275 public function getTitle() {
|
danielebarchiesi@2
|
276 return $this->quickset->getTitle();
|
danielebarchiesi@2
|
277 }
|
danielebarchiesi@2
|
278
|
danielebarchiesi@2
|
279 /**
|
danielebarchiesi@2
|
280 * The only method that renderer plugins must implement.
|
danielebarchiesi@2
|
281 *
|
danielebarchiesi@2
|
282 * @return A render array to be passed to drupal_render().
|
danielebarchiesi@2
|
283 */
|
danielebarchiesi@2
|
284 abstract public function render();
|
danielebarchiesi@2
|
285
|
danielebarchiesi@2
|
286
|
danielebarchiesi@2
|
287 /**
|
danielebarchiesi@2
|
288 * Method for returning the form elements to display for this renderer type on
|
danielebarchiesi@2
|
289 * the admin form.
|
danielebarchiesi@2
|
290
|
danielebarchiesi@2
|
291 * @param $qt An object representing the Quicktabs instance that the tabs are
|
danielebarchiesi@2
|
292 * being built for.
|
danielebarchiesi@2
|
293 */
|
danielebarchiesi@2
|
294 public static function optionsForm($qt) {
|
danielebarchiesi@2
|
295 return array();
|
danielebarchiesi@2
|
296 }
|
danielebarchiesi@2
|
297
|
danielebarchiesi@2
|
298 }
|
danielebarchiesi@2
|
299
|
danielebarchiesi@2
|
300 /*******************************************************
|
danielebarchiesi@2
|
301 * The classes below relate to individual tab content *
|
danielebarchiesi@2
|
302 *******************************************************/
|
danielebarchiesi@2
|
303
|
danielebarchiesi@2
|
304 /**
|
danielebarchiesi@2
|
305 * Each QuickSet object has a "contents" property which is an array of objects
|
danielebarchiesi@2
|
306 * that implement the QuickContentRenderable interface.
|
danielebarchiesi@2
|
307 */
|
danielebarchiesi@2
|
308 interface QuickContentRenderable {
|
danielebarchiesi@2
|
309
|
danielebarchiesi@2
|
310 /**
|
danielebarchiesi@2
|
311 * Returns the short type name of the content plugin, e.g. 'block', 'node',
|
danielebarchiesi@2
|
312 * 'prerendered'.
|
danielebarchiesi@2
|
313 */
|
danielebarchiesi@2
|
314 public static function getType();
|
danielebarchiesi@2
|
315
|
danielebarchiesi@2
|
316 /**
|
danielebarchiesi@2
|
317 * Returns the tab title.
|
danielebarchiesi@2
|
318 */
|
danielebarchiesi@2
|
319 public function getTitle();
|
danielebarchiesi@2
|
320
|
danielebarchiesi@2
|
321 /**
|
danielebarchiesi@2
|
322 * Returns an array of settings specific to the type of content.
|
danielebarchiesi@2
|
323 */
|
danielebarchiesi@2
|
324 public function getSettings();
|
danielebarchiesi@2
|
325
|
danielebarchiesi@2
|
326 /**
|
danielebarchiesi@2
|
327 * Renders the content.
|
danielebarchiesi@2
|
328 *
|
danielebarchiesi@2
|
329 * @param $hide_emtpy If set to true, then the renderer should return an empty
|
danielebarchiesi@2
|
330 * array if there is no content to display, for example if the user does not
|
danielebarchiesi@2
|
331 * have access to the requested content.
|
danielebarchiesi@2
|
332 *
|
danielebarchiesi@2
|
333 * @param $args Used during an ajax call to pass in the settings necessary to
|
danielebarchiesi@2
|
334 * render this type of content.
|
danielebarchiesi@2
|
335 */
|
danielebarchiesi@2
|
336 public function render($hide_empty = FALSE, $args = array());
|
danielebarchiesi@2
|
337
|
danielebarchiesi@2
|
338 /**
|
danielebarchiesi@2
|
339 * Returns an array of keys to use for constructing the correct arguments for
|
danielebarchiesi@2
|
340 * an ajax callback to retrieve content of this type. The order of the keys
|
danielebarchiesi@2
|
341 * returned affects the order of the args passed in to the render method when
|
danielebarchiesi@2
|
342 * called via ajax (see the render() method above).
|
danielebarchiesi@2
|
343 */
|
danielebarchiesi@2
|
344 public function getAjaxKeys();
|
danielebarchiesi@2
|
345
|
danielebarchiesi@2
|
346 }
|
danielebarchiesi@2
|
347
|
danielebarchiesi@2
|
348 /**
|
danielebarchiesi@2
|
349 * Abstract base class for content plugins.
|
danielebarchiesi@2
|
350 */
|
danielebarchiesi@2
|
351 abstract class QuickContent implements QuickContentRenderable {
|
danielebarchiesi@2
|
352
|
danielebarchiesi@2
|
353 /**
|
danielebarchiesi@2
|
354 * Used as the title of the tab.
|
danielebarchiesi@2
|
355 * @var string
|
danielebarchiesi@2
|
356 */
|
danielebarchiesi@2
|
357 protected $title;
|
danielebarchiesi@2
|
358
|
danielebarchiesi@2
|
359 /**
|
danielebarchiesi@2
|
360 * An array containing the information that defines the tab content, specific
|
danielebarchiesi@2
|
361 * to its type.
|
danielebarchiesi@2
|
362 * @var array
|
danielebarchiesi@2
|
363 */
|
danielebarchiesi@2
|
364 protected $settings;
|
danielebarchiesi@2
|
365
|
danielebarchiesi@2
|
366 /**
|
danielebarchiesi@2
|
367 * A render array of the contents.
|
danielebarchiesi@2
|
368 * @var array
|
danielebarchiesi@2
|
369 */
|
danielebarchiesi@2
|
370 protected $rendered_content;
|
danielebarchiesi@2
|
371
|
danielebarchiesi@2
|
372
|
danielebarchiesi@2
|
373 /**
|
danielebarchiesi@2
|
374 * Constructor
|
danielebarchiesi@2
|
375 */
|
danielebarchiesi@2
|
376 public function __construct($item) {
|
danielebarchiesi@2
|
377 $this->title = isset($item['title']) ? $item['title'] : '';
|
danielebarchiesi@2
|
378 // We do not need to store title, type or weight in the settings array, which
|
danielebarchiesi@2
|
379 // is for type-specific settings.
|
danielebarchiesi@2
|
380 unset($item['title'], $item['type'], $item['weight']);
|
danielebarchiesi@2
|
381 $this->settings = $item;
|
danielebarchiesi@2
|
382 }
|
danielebarchiesi@2
|
383
|
danielebarchiesi@2
|
384
|
danielebarchiesi@2
|
385 /**
|
danielebarchiesi@2
|
386 * Accessor for the tab title.
|
danielebarchiesi@2
|
387 */
|
danielebarchiesi@2
|
388 public function getTitle() {
|
danielebarchiesi@2
|
389 return $this->title;
|
danielebarchiesi@2
|
390 }
|
danielebarchiesi@2
|
391
|
danielebarchiesi@2
|
392 /**
|
danielebarchiesi@2
|
393 * Accessor for the tab settings.
|
danielebarchiesi@2
|
394 */
|
danielebarchiesi@2
|
395 public function getSettings() {
|
danielebarchiesi@2
|
396 return $this->settings;
|
danielebarchiesi@2
|
397 }
|
danielebarchiesi@2
|
398
|
danielebarchiesi@2
|
399 /**
|
danielebarchiesi@2
|
400 * Instantiate a content type object.
|
danielebarchiesi@2
|
401 *
|
danielebarchiesi@2
|
402 * @param $name
|
danielebarchiesi@2
|
403 * The type name of the plugin.
|
danielebarchiesi@2
|
404 *
|
danielebarchiesi@2
|
405 * @param $item
|
danielebarchiesi@2
|
406 * An array containing the item definition
|
danielebarchiesi@2
|
407 *
|
danielebarchiesi@2
|
408 */
|
danielebarchiesi@2
|
409 public static function factory($name, $item) {
|
danielebarchiesi@2
|
410 ctools_include('plugins');
|
danielebarchiesi@2
|
411 if ($class = ctools_plugin_load_class('quicktabs', 'contents', $name, 'handler')) {
|
danielebarchiesi@2
|
412 // We now need to check the plugin's dependencies, to make sure they're installed.
|
danielebarchiesi@2
|
413 // This info has already been statically cached at this point so there's no
|
danielebarchiesi@2
|
414 // harm in making a call to ctools_get_plugins().
|
danielebarchiesi@2
|
415 $plugin = ctools_get_plugins('quicktabs', 'contents', $name);
|
danielebarchiesi@2
|
416 if (isset($plugin['dependencies'])) {
|
danielebarchiesi@2
|
417 foreach ($plugin['dependencies'] as $dep) {
|
danielebarchiesi@2
|
418 // If any dependency is missing we cannot instantiate our class.
|
danielebarchiesi@2
|
419 if (!module_exists($dep)) return NULL;
|
danielebarchiesi@2
|
420 }
|
danielebarchiesi@2
|
421 }
|
danielebarchiesi@2
|
422 return new $class($item);
|
danielebarchiesi@2
|
423 }
|
danielebarchiesi@2
|
424 return NULL;
|
danielebarchiesi@2
|
425 }
|
danielebarchiesi@2
|
426
|
danielebarchiesi@2
|
427 /**
|
danielebarchiesi@2
|
428 * Method for returning the form elements to display for this tab type on
|
danielebarchiesi@2
|
429 * the admin form.
|
danielebarchiesi@2
|
430 *
|
danielebarchiesi@2
|
431 * @param $delta Integer representing this tab's position in the tabs array.
|
danielebarchiesi@2
|
432 *
|
danielebarchiesi@2
|
433 * @param $qt An object representing the Quicktabs instance that the tabs are
|
danielebarchiesi@2
|
434 * being built for.
|
danielebarchiesi@2
|
435 */
|
danielebarchiesi@2
|
436 abstract public function optionsForm($delta, $qt);
|
danielebarchiesi@2
|
437
|
danielebarchiesi@2
|
438 }
|
danielebarchiesi@2
|
439
|
danielebarchiesi@2
|
440 /**
|
danielebarchiesi@2
|
441 * This class implements the same interface that content plugins do but it is not
|
danielebarchiesi@2
|
442 * a content plugin. It is a special class for pre-rendered content which is used
|
danielebarchiesi@2
|
443 * when "custom" tabs are added to existing Quicktabs instances in a call to
|
danielebarchiesi@2
|
444 * quicktabs_build_quicktabs().
|
danielebarchiesi@2
|
445 */
|
danielebarchiesi@2
|
446 class QuickPreRenderedContent implements QuickContentRenderable {
|
danielebarchiesi@2
|
447
|
danielebarchiesi@2
|
448 public static function getType() {
|
danielebarchiesi@2
|
449 return 'prerendered';
|
danielebarchiesi@2
|
450 }
|
danielebarchiesi@2
|
451
|
danielebarchiesi@2
|
452 /**
|
danielebarchiesi@2
|
453 * Used as the title of the tab.
|
danielebarchiesi@2
|
454 * @var title
|
danielebarchiesi@2
|
455 */
|
danielebarchiesi@2
|
456 protected $title;
|
danielebarchiesi@2
|
457
|
danielebarchiesi@2
|
458 /**
|
danielebarchiesi@2
|
459 * A render array of the contents.
|
danielebarchiesi@2
|
460 * @var array
|
danielebarchiesi@2
|
461 */
|
danielebarchiesi@2
|
462 protected $rendered_content;
|
danielebarchiesi@2
|
463
|
danielebarchiesi@2
|
464
|
danielebarchiesi@2
|
465 /**
|
danielebarchiesi@2
|
466 * Constructor
|
danielebarchiesi@2
|
467 */
|
danielebarchiesi@2
|
468 public function __construct($item) {
|
danielebarchiesi@2
|
469
|
danielebarchiesi@2
|
470 $contents = isset($item['contents']) ? $item['contents'] : array();
|
danielebarchiesi@2
|
471 if (!is_array($contents)) {
|
danielebarchiesi@2
|
472 $contents = array('#markup' => $contents);
|
danielebarchiesi@2
|
473 }
|
danielebarchiesi@2
|
474 $this->rendered_content = $contents;
|
danielebarchiesi@2
|
475
|
danielebarchiesi@2
|
476 $this->title = isset($item['title']) ? $item['title'] : '';
|
danielebarchiesi@2
|
477 }
|
danielebarchiesi@2
|
478
|
danielebarchiesi@2
|
479 /**
|
danielebarchiesi@2
|
480 * Accessor for the tab title.
|
danielebarchiesi@2
|
481 */
|
danielebarchiesi@2
|
482 public function getTitle() {
|
danielebarchiesi@2
|
483 return $this->title;
|
danielebarchiesi@2
|
484 }
|
danielebarchiesi@2
|
485
|
danielebarchiesi@2
|
486 /**
|
danielebarchiesi@2
|
487 * Prerendered content doesn't need any extra settings.
|
danielebarchiesi@2
|
488 */
|
danielebarchiesi@2
|
489 public function getSettings() {
|
danielebarchiesi@2
|
490 return array();
|
danielebarchiesi@2
|
491 }
|
danielebarchiesi@2
|
492
|
danielebarchiesi@2
|
493
|
danielebarchiesi@2
|
494 /**
|
danielebarchiesi@2
|
495 * The render method simply returns the contents that were passed in and
|
danielebarchiesi@2
|
496 * stored during construction.
|
danielebarchiesi@2
|
497 */
|
danielebarchiesi@2
|
498 public function render($hide_empty = FALSE, $args = array()) {
|
danielebarchiesi@2
|
499 return $this->rendered_content;
|
danielebarchiesi@2
|
500 }
|
danielebarchiesi@2
|
501
|
danielebarchiesi@2
|
502 /**
|
danielebarchiesi@2
|
503 * This content cannot be rendered via ajax so we don't return any ajax keys.
|
danielebarchiesi@2
|
504 */
|
danielebarchiesi@2
|
505 public function getAjaxKeys() {
|
danielebarchiesi@2
|
506 return array();
|
danielebarchiesi@2
|
507 }
|
danielebarchiesi@2
|
508
|
danielebarchiesi@2
|
509 }
|
danielebarchiesi@2
|
510
|
danielebarchiesi@2
|
511 /**
|
danielebarchiesi@2
|
512 * Create our own exception class.
|
danielebarchiesi@2
|
513 */
|
danielebarchiesi@2
|
514 class InvalidQuickSetException extends Exception {
|
danielebarchiesi@2
|
515
|
danielebarchiesi@2
|
516 } |