WebLibraryManager   A
last analyzed

Complexity

Total Complexity 19

Size/Duplication

Total Lines 152
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Importance

Changes 0
Metric Value
wmc 19
lcom 1
cbo 6
dl 0
loc 152
rs 10
c 0
b 0
f 0

10 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A addLibrary() 0 17 5
A setWebLibraries() 0 5 2
A toHtml() 0 11 1
A addJsFile() 0 3 1
A addCssFile() 0 3 1
A addAdditionalScript() 0 6 2
A getCssHtml() 0 7 2
A getJsHtml() 0 7 2
A getAdditionalHtml() 0 7 2
1
<?php 
2
namespace Mouf\Html\Utils\WebLibraryManager;
3
4
use Mouf\Html\HtmlElement\HtmlElementInterface;
5
use Mouf\Html\Renderer\RendererInterface;
6
use Mouf\Html\HtmlElement\HtmlString;
7
8
/**
9
 * This class is in charge of including and keeping track of Javascript and CSS libraries into an HTML page.
10
 * <p>JS and CSS files are grouped into <b>WebLibraries</b>. If you want to add a new library, just create an instance
11
 * of the <b>WebLibrary</b> class, and add it to the <b>WebLibraryManager</b>.</p>
12
 * <p>You can use the <b>WebLibraryManager</b> class to add JS/CSS libraries. It will keep track of dependencies and ensure each file is included
13
 * only once.</p>
14
15
 * <p>If you have specific needs and don't want to use the <b>WebLibrary</b> class, you can either create your own class
16
 * that implements the WebLibraryInterface, or provide your own "renderer".</p>
17
 * 
18
 * 
19
 * @author David Négrier
20
 */
21
class WebLibraryManager implements HtmlElementInterface {
22
	
23
	/**
24
	 * The array of all included libraries.
25
	 * 
26
	 * @var WebLibraryInterface[]
27
	 */
28
	private $webLibraries = array();
29
	
30
	/**
31
	 * false if the toHtml method has not yet been called, true if it has been called.
32
	 * @var boolean
33
	 */
34
	private $rendered = false;
35
	
36
	/**
37
	 * The renderer used by the application. Usually, this points to the 'defaultRenderer' instance.
38
	 * 
39
	 * @var RendererInterface
40
	 */
41
	private $renderer;
42
	
43
	/**
44
	 * 
45
	 * @param RendererInterface $renderer The renderer used by the application. Usually, this points to the 'defaultRenderer' instance.
46
	 */
47
	public function __construct(RendererInterface $renderer) {
48
		$this->renderer = $renderer;
49
	}
50
	
51
	/**
52
	 * Adds a library to the list of libraries that should be loaded in the web page.
53
	 * <p>The function will also load the dependencies (if any) and will have no effect if the library has already been loaded.</p>
54
	 * 
55
	 * @param WebLibraryInterface $library
56
	 */
57
	public function addLibrary(WebLibraryInterface $library) {
58
		if ($this->rendered) {
59
			throw new WebLibraryException("The libraries have already been rendered. This call to addLibrary should be performed BEFORE the toHtml method of WebLibraryManager is called.");
60
		}
61
		if (array_search($library, $this->webLibraries) === false) {
62
			// Let's start by adding dependencies.
63
			$dependencies = $library->getDependencies();
64
			if ($dependencies) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $dependencies of type Mouf\Html\Utils\WebLibra...r\WebLibraryInterface[] is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
65
				foreach ($dependencies as $dependency) {
66
					/* @var $dependency WebLibraryInterface */
67
					$this->addLibrary($dependency);
68
				}
69
			}
70
			
71
			$this->webLibraries[] = $library;
72
		}
73
	}
74
		
75
	/**
76
	 * The list of all libraries that should be loaded in the web page.
77
	 * <p>If you do not pass all dependencies of a library, the dependencies will be loaded automatically.</p>
78
	 * 
79
	 * @param array<WebLibraryInterface> $libraries
80
	 */
81
	public function setWebLibraries($libraries) {
82
		foreach ($libraries as $library) {
83
			$this->addLibrary($library);
84
		}
85
	}
86
	
87
	/**
88
	 * Renders the HTML in charge of loading CSS and JS files.
89
	 * The Html is echoed directly into the output.
90
	 * This function should be called within the head tag.
91
	 *
92
	 */
93
	public function toHtml() {
94
		/*if ($this->rendered) {
95
			throw new WebLibraryException("The library has already been rendered.");
96
		}*/
97
		
98
		echo $this->getCssHtml();
99
		echo $this->getJsHtml();
100
		echo $this->getAdditionalHtml();
101
102
		$this->rendered = true;
103
	}
104
105
	/**
106
	 * Adds a single JS file to the list of files to be included in the &lt;head&gt; tag.
107
	 * <p>If you don't specify http:// or https:// and if the file does not start with /, the file is considered to be relative to ROOT_URL.</p>
108
	 * <div class="info">It is a good practice to make sure the file does not start with /, http:// or https:// (unless you are using a CDN).</div>
109
	 * 
110
	 * @param string $jsFile
111
	 */
112
	public function addJsFile($jsFile) {
113
		$this->webLibraries[] = new WebLibrary([$jsFile]);
114
	}
115
	
116
	/**
117
	 * Adds a single CSS file to the list of files to be included in the &lt;head&gt; tag.
118
	 * <p>If you don't specify http:// or https:// and if the file does not start with /, the file is considered to be relative to ROOT_URL.</p>
119
	 * <div class="info">It is a good practice to make sure the file does not start with /, http:// or https:// (unless you are using a CDN).</div>
120
	 *
121
	 * @param string $cssFile
122
	 */
123
	public function addCssFile($cssFile) {
124
		$this->webLibraries[] = new WebLibrary([], [$cssFile]);
125
	}
126
	
127
	/**
128
	 * Adds an additional script at the end of the &lt;head&gt; tag.
129
	 * The provided script can either be a string or an object implementing HtmlElementInterface.
130
	 * 
131
	 * @param string|HtmlElementInterface $additionalScript
132
	 */
133
	public function addAdditionalScript($additionalScript) {
134
		if (!$additionalScript instanceof HtmlElementInterface) {
135
			$additionalScript = new HtmlString($additionalScript);
136
		}
137
		$this->webLibraries[] = new InlineWebLibrary(null, null, $additionalScript);
138
	}
139
140
    /**
141
     * @return string
142
     */
143
	public function getCssHtml() {
144
	    ob_start();
145
        foreach ($this->webLibraries as $library) {
146
            $this->renderer->render($library, 'css');
147
        }
148
        return ob_get_clean();
149
    }
150
151
    /**
152
     * @return string
153
     */
154
    public function getJsHtml() {
155
        ob_start();
156
        foreach ($this->webLibraries as $library) {
157
            $this->renderer->render($library, 'js');
158
        }
159
        return ob_get_clean();
160
    }
161
162
    /**
163
     * @return string
164
     */
165
    public function getAdditionalHtml() {
166
        ob_start();
167
        foreach ($this->webLibraries as $library) {
168
            $this->renderer->render($library, 'additional');
169
        }
170
        return ob_get_clean();
171
    }
172
}
173