@@ -9,146 +9,146 @@ |
||
9 | 9 | */ |
10 | 10 | class RootFolder extends DataExtension |
11 | 11 | { |
12 | - private static $has_one = array( |
|
13 | - 'RootFolder' => 'Folder', |
|
14 | - ); |
|
15 | - |
|
16 | - /** |
|
17 | - * @var array exclude this page types and class names |
|
18 | - */ |
|
19 | - private static $ignored_classes = array('VirtualPage', 'ErrorPage'); |
|
20 | - |
|
21 | - /** |
|
22 | - * @var bool should folders be created for translated objects? |
|
23 | - */ |
|
24 | - private static $create_folder_for_translations = false; |
|
25 | - |
|
26 | - /** |
|
27 | - * @var string default root for all folders; may be overwritten in config of decorated class |
|
28 | - */ |
|
29 | - private static $folder_root = 'Articles'; |
|
30 | - |
|
31 | - public function onAfterWrite() |
|
32 | - { |
|
33 | - if ($this->owner->ID) { |
|
34 | - $this->checkFolder(); |
|
35 | - } |
|
36 | - } |
|
37 | - |
|
38 | - /** |
|
39 | - * Creates a folder for a page as a subfolder of the parent page |
|
40 | - * You can exclude page types by setting $ignored_classes in config |
|
41 | - * |
|
42 | - * Doesn't create folders for translated pages by default. |
|
43 | - * |
|
44 | - * @TODO doesn't check if page is moved to another parent |
|
45 | - */ |
|
46 | - public function checkFolder() |
|
47 | - { |
|
48 | - $ignoredPageTypes = Config::inst()->get($this->class, 'ignored_classes'); |
|
49 | - |
|
50 | - foreach ($ignoredPageTypes as $pagetype) { |
|
51 | - if (is_a($this->owner, $pagetype)) { |
|
52 | - return; |
|
53 | - } |
|
54 | - } |
|
55 | - |
|
56 | - if (class_exists('Translatable') |
|
57 | - && $this->owner->Locale !== Translatable::default_locale() |
|
58 | - && !Config::inst()->get($this->class, 'create_folder_for_translations') |
|
59 | - ) { |
|
60 | - return; |
|
61 | - } |
|
62 | - |
|
63 | - if (!$this->owner->RootFolderID) { |
|
64 | - $this->createRootFolder(); |
|
65 | - } else { |
|
66 | - $this->updateRootFolder(); |
|
67 | - } |
|
68 | - } |
|
69 | - |
|
70 | - /** |
|
71 | - * Does the work of creating a new RootFolder, saves the relation in the extended DataObject |
|
72 | - */ |
|
73 | - protected function createRootFolder() |
|
74 | - { |
|
75 | - //get path to parent folder |
|
76 | - $parent = $this->owner->hasExtension('Hierarchy') |
|
77 | - ? $this->owner->getParent() |
|
78 | - : null; |
|
79 | - if (is_a($parent, 'Page') && $parentFolder = $parent->RootFolder()) { |
|
80 | - $folderRoot = $parent->getRootFolderName(); |
|
81 | - } else { |
|
82 | - //fallback to classes folder_root which is defined in your config.yml |
|
83 | - $folderRoot = $this->getFolderRoot() . '/'; |
|
84 | - } |
|
85 | - |
|
86 | - if ($folderRoot == '/') { |
|
87 | - $folderRoot = getFolderRoot() . '/'; |
|
88 | - } |
|
89 | - |
|
90 | - $folder = Folder::find_or_make($folderRoot . $this->owner->URLSegment); |
|
91 | - $folder->Title = $this->owner->Title; |
|
92 | - $folder->setName($this->owner->URLSegment); |
|
93 | - $folder->write(); |
|
94 | - |
|
95 | - $this->owner->RootFolderID = $folder->ID; |
|
96 | - $this->owner->write(); |
|
97 | - } |
|
98 | - |
|
99 | - /** |
|
100 | - * Does the work of updating the folder if the URLSegment or ParentID is changed. |
|
101 | - * if both it does two writes... |
|
102 | - * |
|
103 | - * @todo: rethink moving subfolders as it may timeout on real large trees |
|
104 | - */ |
|
105 | - protected function updateRootFolder() |
|
106 | - { |
|
107 | - $rootFolder = $this->owner->RootFolder(); |
|
108 | - if ($this->owner->isChanged('URLSegment') && $this->owner->URLSegment) { |
|
109 | - $rootFolder->setName($this->owner->URLSegment); |
|
110 | - $rootFolder->write(); |
|
111 | - } |
|
112 | - |
|
113 | - if ($this->owner->isChanged('ParentID') && $this->owner->ParentID > 0) { |
|
114 | - $oldParentID = $rootFolder->ParentID; |
|
115 | - $newParentID = $this->owner->Parent()->RootFolderID; |
|
116 | - if ($oldParentID !== $newParentID && $newParentID !== $rootFolder->ID) { |
|
117 | - $rootFolder->setParentID($newParentID); |
|
118 | - $rootFolder->write(); |
|
119 | - } |
|
120 | - } |
|
121 | - } |
|
122 | - |
|
123 | - /** |
|
124 | - * Returns the folder root for the current root folder, e.g. 'Articles', |
|
125 | - * if a config $folder_root is defined in the decorated class. |
|
126 | - * |
|
127 | - * Falls back to global config |
|
128 | - */ |
|
129 | - public function getFolderRoot() |
|
130 | - { |
|
131 | - return ($this->owner->config()->get('folder_root')) |
|
132 | - ? $this->owner->config()->get('folder_root') |
|
133 | - : Config::inst()->get($this->class, 'folder_root'); |
|
134 | - } |
|
135 | - |
|
136 | - |
|
137 | - /** |
|
138 | - * Helper function to return the name of the RootFolder for setting in @link UploadField or @link GridFieldBulkUpload |
|
139 | - * By default relative to /assets/ |
|
140 | - * |
|
141 | - * @param bool $relativeToAssetsDir |
|
142 | - */ |
|
143 | - public function getRootFolderName($relativeToAssetsDir = true) |
|
144 | - { |
|
145 | - if ($this->owner->RootFolderID) { |
|
146 | - return $relativeToAssetsDir |
|
147 | - ? str_replace(ASSETS_DIR . '/', '', $this->owner->RootFolder()->getRelativePath()) |
|
148 | - : $this->owner->RootFolder()->getRelativePath(); |
|
149 | - } else { |
|
150 | - //use folder root as fallback for now |
|
151 | - return $this->getFolderRoot(); |
|
152 | - } |
|
153 | - } |
|
12 | + private static $has_one = array( |
|
13 | + 'RootFolder' => 'Folder', |
|
14 | + ); |
|
15 | + |
|
16 | + /** |
|
17 | + * @var array exclude this page types and class names |
|
18 | + */ |
|
19 | + private static $ignored_classes = array('VirtualPage', 'ErrorPage'); |
|
20 | + |
|
21 | + /** |
|
22 | + * @var bool should folders be created for translated objects? |
|
23 | + */ |
|
24 | + private static $create_folder_for_translations = false; |
|
25 | + |
|
26 | + /** |
|
27 | + * @var string default root for all folders; may be overwritten in config of decorated class |
|
28 | + */ |
|
29 | + private static $folder_root = 'Articles'; |
|
30 | + |
|
31 | + public function onAfterWrite() |
|
32 | + { |
|
33 | + if ($this->owner->ID) { |
|
34 | + $this->checkFolder(); |
|
35 | + } |
|
36 | + } |
|
37 | + |
|
38 | + /** |
|
39 | + * Creates a folder for a page as a subfolder of the parent page |
|
40 | + * You can exclude page types by setting $ignored_classes in config |
|
41 | + * |
|
42 | + * Doesn't create folders for translated pages by default. |
|
43 | + * |
|
44 | + * @TODO doesn't check if page is moved to another parent |
|
45 | + */ |
|
46 | + public function checkFolder() |
|
47 | + { |
|
48 | + $ignoredPageTypes = Config::inst()->get($this->class, 'ignored_classes'); |
|
49 | + |
|
50 | + foreach ($ignoredPageTypes as $pagetype) { |
|
51 | + if (is_a($this->owner, $pagetype)) { |
|
52 | + return; |
|
53 | + } |
|
54 | + } |
|
55 | + |
|
56 | + if (class_exists('Translatable') |
|
57 | + && $this->owner->Locale !== Translatable::default_locale() |
|
58 | + && !Config::inst()->get($this->class, 'create_folder_for_translations') |
|
59 | + ) { |
|
60 | + return; |
|
61 | + } |
|
62 | + |
|
63 | + if (!$this->owner->RootFolderID) { |
|
64 | + $this->createRootFolder(); |
|
65 | + } else { |
|
66 | + $this->updateRootFolder(); |
|
67 | + } |
|
68 | + } |
|
69 | + |
|
70 | + /** |
|
71 | + * Does the work of creating a new RootFolder, saves the relation in the extended DataObject |
|
72 | + */ |
|
73 | + protected function createRootFolder() |
|
74 | + { |
|
75 | + //get path to parent folder |
|
76 | + $parent = $this->owner->hasExtension('Hierarchy') |
|
77 | + ? $this->owner->getParent() |
|
78 | + : null; |
|
79 | + if (is_a($parent, 'Page') && $parentFolder = $parent->RootFolder()) { |
|
80 | + $folderRoot = $parent->getRootFolderName(); |
|
81 | + } else { |
|
82 | + //fallback to classes folder_root which is defined in your config.yml |
|
83 | + $folderRoot = $this->getFolderRoot() . '/'; |
|
84 | + } |
|
85 | + |
|
86 | + if ($folderRoot == '/') { |
|
87 | + $folderRoot = getFolderRoot() . '/'; |
|
88 | + } |
|
89 | + |
|
90 | + $folder = Folder::find_or_make($folderRoot . $this->owner->URLSegment); |
|
91 | + $folder->Title = $this->owner->Title; |
|
92 | + $folder->setName($this->owner->URLSegment); |
|
93 | + $folder->write(); |
|
94 | + |
|
95 | + $this->owner->RootFolderID = $folder->ID; |
|
96 | + $this->owner->write(); |
|
97 | + } |
|
98 | + |
|
99 | + /** |
|
100 | + * Does the work of updating the folder if the URLSegment or ParentID is changed. |
|
101 | + * if both it does two writes... |
|
102 | + * |
|
103 | + * @todo: rethink moving subfolders as it may timeout on real large trees |
|
104 | + */ |
|
105 | + protected function updateRootFolder() |
|
106 | + { |
|
107 | + $rootFolder = $this->owner->RootFolder(); |
|
108 | + if ($this->owner->isChanged('URLSegment') && $this->owner->URLSegment) { |
|
109 | + $rootFolder->setName($this->owner->URLSegment); |
|
110 | + $rootFolder->write(); |
|
111 | + } |
|
112 | + |
|
113 | + if ($this->owner->isChanged('ParentID') && $this->owner->ParentID > 0) { |
|
114 | + $oldParentID = $rootFolder->ParentID; |
|
115 | + $newParentID = $this->owner->Parent()->RootFolderID; |
|
116 | + if ($oldParentID !== $newParentID && $newParentID !== $rootFolder->ID) { |
|
117 | + $rootFolder->setParentID($newParentID); |
|
118 | + $rootFolder->write(); |
|
119 | + } |
|
120 | + } |
|
121 | + } |
|
122 | + |
|
123 | + /** |
|
124 | + * Returns the folder root for the current root folder, e.g. 'Articles', |
|
125 | + * if a config $folder_root is defined in the decorated class. |
|
126 | + * |
|
127 | + * Falls back to global config |
|
128 | + */ |
|
129 | + public function getFolderRoot() |
|
130 | + { |
|
131 | + return ($this->owner->config()->get('folder_root')) |
|
132 | + ? $this->owner->config()->get('folder_root') |
|
133 | + : Config::inst()->get($this->class, 'folder_root'); |
|
134 | + } |
|
135 | + |
|
136 | + |
|
137 | + /** |
|
138 | + * Helper function to return the name of the RootFolder for setting in @link UploadField or @link GridFieldBulkUpload |
|
139 | + * By default relative to /assets/ |
|
140 | + * |
|
141 | + * @param bool $relativeToAssetsDir |
|
142 | + */ |
|
143 | + public function getRootFolderName($relativeToAssetsDir = true) |
|
144 | + { |
|
145 | + if ($this->owner->RootFolderID) { |
|
146 | + return $relativeToAssetsDir |
|
147 | + ? str_replace(ASSETS_DIR . '/', '', $this->owner->RootFolder()->getRelativePath()) |
|
148 | + : $this->owner->RootFolder()->getRelativePath(); |
|
149 | + } else { |
|
150 | + //use folder root as fallback for now |
|
151 | + return $this->getFolderRoot(); |
|
152 | + } |
|
153 | + } |
|
154 | 154 | } |
@@ -6,134 +6,134 @@ |
||
6 | 6 | class RootFolderTest extends SapphireTest |
7 | 7 | { |
8 | 8 | |
9 | - protected static $fixture_file = 'RootFolderTest.yml'; |
|
10 | - |
|
11 | - /** |
|
12 | - * Check if a folder is generated and saved when a page is saved. |
|
13 | - */ |
|
14 | - public function testCreateFolder() |
|
15 | - { |
|
16 | - $page = Page::create(); |
|
17 | - $this->assertEquals(0, $page->RootFolderID, 'a new Page should not have a folder yet'); |
|
18 | - |
|
19 | - $page->Title = 'Create Page Test'; |
|
20 | - |
|
21 | - $page->write(); |
|
22 | - |
|
23 | - $this->assertNotEquals(0, $page->RootFolderID, 'a page should have a folder after saving'); |
|
24 | - |
|
25 | - $folder = $page->RootFolder(); |
|
26 | - |
|
27 | - $this->assertEquals($page->URLSegment, $folder->Name, 'Page URLSegment and Folder Title should be the same'); |
|
28 | - $path = ASSETS_DIR . '/' . $root = Config::inst()->get('RootFolder', 'folder_root') . '/' |
|
29 | - . $page->URLSegment . '/'; |
|
30 | - |
|
31 | - $this->assertEquals( |
|
32 | - $path, |
|
33 | - $folder->getRelativePath(), |
|
34 | - 'folder path should be assets/Articles/' . $page->URLSegment |
|
35 | - ); |
|
36 | - } |
|
37 | - |
|
38 | - /** |
|
39 | - * Checks if the folder will be updated when saving a page and changing the URLSegment |
|
40 | - */ |
|
41 | - public function testUpdateFolder() |
|
42 | - { |
|
43 | - $page1 = $this->objFromFixture('Page', 'page1'); |
|
44 | - $folder = $page1->RootFolder(); |
|
45 | - |
|
46 | - $this->assertEquals($page1->URLSegment, $folder->Name, 'Page URLSegment and Folder Title should be the same'); |
|
47 | - |
|
48 | - $page1->URLSegment = ('updatedpage'); |
|
49 | - $page1->write(); |
|
50 | - |
|
51 | - $folder = $page1->RootFolder(); //reload folder after saving |
|
52 | - $this->assertEquals('updatedpage', $folder->Name, 'Folder name should be updated after saving a page'); |
|
53 | - $this->assertEquals( |
|
54 | - $page1->URLSegment, |
|
55 | - $folder->Name, |
|
56 | - 'Page URLSegment and Folder Title should be the same, even after updating' |
|
57 | - ); |
|
58 | - } |
|
59 | - |
|
60 | - /** |
|
61 | - * Checks if no folder is created for ignored page types, e.g. VirtualPage or ErrorPage |
|
62 | - */ |
|
63 | - public function testIgnoredPageTypes() |
|
64 | - { |
|
65 | - $ignoredPageTypes = Config::inst()->get('RootFolder', 'ignored_classes'); |
|
66 | - |
|
67 | - foreach ($ignoredPageTypes as $type) { |
|
68 | - $page = $type::create(); |
|
69 | - |
|
70 | - $page->write(); |
|
71 | - $this->assertEquals( |
|
72 | - 0, |
|
73 | - $page->RootFolderID, |
|
74 | - 'Ignored page type ' . $type . ' should not have a RootFolderID' |
|
75 | - ); |
|
76 | - } |
|
77 | - } |
|
78 | - |
|
79 | - /** |
|
80 | - * Check if subpage's folder is a subfolder of parent page |
|
81 | - */ |
|
82 | - public function testHierarchy() |
|
83 | - { |
|
84 | - $parent = $this->objFromFixture('Page', 'parentpage'); |
|
85 | - $child = $this->objFromFixture('Page', 'subpage'); |
|
86 | - |
|
87 | - //test if fixtures are set up properly |
|
88 | - $this->assertEquals($parent->ID, $child->ParentID, 'subpage should be a child of parentpage'); |
|
89 | - |
|
90 | - $this->assertEquals( |
|
91 | - $parent->RootFolderID, |
|
92 | - $child->RootFolder()->ParentID, |
|
93 | - 'rootfolder2 should be a child of rootfolder 1' |
|
94 | - ); |
|
95 | - |
|
96 | - $newPage = Page::create(); |
|
97 | - $newPage->ParentID = $parent->ID; |
|
98 | - $newPage->Title = 'Hierarchy Test'; |
|
99 | - $newPage->urlSegment = 'hierarchy-test'; |
|
100 | - $newPage->write(); |
|
101 | - |
|
102 | - $this->assertEquals( |
|
103 | - $parent->RootFolderID, |
|
104 | - $newPage->RootFolder()->ParentID, |
|
105 | - 'new folder should be a child of page1 folder' |
|
106 | - ); |
|
107 | - } |
|
108 | - |
|
109 | - /** |
|
110 | - * Checks if getRootFolderName() works properly |
|
111 | - */ |
|
112 | - public function testGetRootFolderName() |
|
113 | - { |
|
114 | - $parent = $this->objFromFixture('Page', 'parentpage'); |
|
115 | - $child = $this->objFromFixture('Page', 'subpage'); |
|
116 | - |
|
117 | - //test if fixtures are set up properly |
|
118 | - $this->assertEquals($parent->ID, $child->ParentID, 'subpage should be a child of parentpage'); |
|
119 | - |
|
120 | - $this->assertStringEndsWith( |
|
121 | - $child->RootFolder()->Name . '/', |
|
122 | - $child->getRootFolderName(), |
|
123 | - 'FolderName should be at the end of getRootFolderName()' |
|
124 | - ); |
|
125 | - |
|
126 | - $root = Config::inst()->get('RootFolder', 'folder_root'); |
|
127 | - $this->assertStringStartsWith( |
|
128 | - $root . '/' . $parent->RootFolder()->Name, |
|
129 | - $child->getRootFolderName(), |
|
130 | - 'Parents FolderName should be at the beginning of getRootFolderName()' |
|
131 | - ); |
|
132 | - |
|
133 | - $this->assertStringStartsWith( |
|
134 | - ASSETS_DIR, |
|
135 | - $child->getRootFolderName(false), |
|
136 | - 'ASSETS_DIR should be at the beginning of getRootFolderName(false)' |
|
137 | - ); |
|
138 | - } |
|
9 | + protected static $fixture_file = 'RootFolderTest.yml'; |
|
10 | + |
|
11 | + /** |
|
12 | + * Check if a folder is generated and saved when a page is saved. |
|
13 | + */ |
|
14 | + public function testCreateFolder() |
|
15 | + { |
|
16 | + $page = Page::create(); |
|
17 | + $this->assertEquals(0, $page->RootFolderID, 'a new Page should not have a folder yet'); |
|
18 | + |
|
19 | + $page->Title = 'Create Page Test'; |
|
20 | + |
|
21 | + $page->write(); |
|
22 | + |
|
23 | + $this->assertNotEquals(0, $page->RootFolderID, 'a page should have a folder after saving'); |
|
24 | + |
|
25 | + $folder = $page->RootFolder(); |
|
26 | + |
|
27 | + $this->assertEquals($page->URLSegment, $folder->Name, 'Page URLSegment and Folder Title should be the same'); |
|
28 | + $path = ASSETS_DIR . '/' . $root = Config::inst()->get('RootFolder', 'folder_root') . '/' |
|
29 | + . $page->URLSegment . '/'; |
|
30 | + |
|
31 | + $this->assertEquals( |
|
32 | + $path, |
|
33 | + $folder->getRelativePath(), |
|
34 | + 'folder path should be assets/Articles/' . $page->URLSegment |
|
35 | + ); |
|
36 | + } |
|
37 | + |
|
38 | + /** |
|
39 | + * Checks if the folder will be updated when saving a page and changing the URLSegment |
|
40 | + */ |
|
41 | + public function testUpdateFolder() |
|
42 | + { |
|
43 | + $page1 = $this->objFromFixture('Page', 'page1'); |
|
44 | + $folder = $page1->RootFolder(); |
|
45 | + |
|
46 | + $this->assertEquals($page1->URLSegment, $folder->Name, 'Page URLSegment and Folder Title should be the same'); |
|
47 | + |
|
48 | + $page1->URLSegment = ('updatedpage'); |
|
49 | + $page1->write(); |
|
50 | + |
|
51 | + $folder = $page1->RootFolder(); //reload folder after saving |
|
52 | + $this->assertEquals('updatedpage', $folder->Name, 'Folder name should be updated after saving a page'); |
|
53 | + $this->assertEquals( |
|
54 | + $page1->URLSegment, |
|
55 | + $folder->Name, |
|
56 | + 'Page URLSegment and Folder Title should be the same, even after updating' |
|
57 | + ); |
|
58 | + } |
|
59 | + |
|
60 | + /** |
|
61 | + * Checks if no folder is created for ignored page types, e.g. VirtualPage or ErrorPage |
|
62 | + */ |
|
63 | + public function testIgnoredPageTypes() |
|
64 | + { |
|
65 | + $ignoredPageTypes = Config::inst()->get('RootFolder', 'ignored_classes'); |
|
66 | + |
|
67 | + foreach ($ignoredPageTypes as $type) { |
|
68 | + $page = $type::create(); |
|
69 | + |
|
70 | + $page->write(); |
|
71 | + $this->assertEquals( |
|
72 | + 0, |
|
73 | + $page->RootFolderID, |
|
74 | + 'Ignored page type ' . $type . ' should not have a RootFolderID' |
|
75 | + ); |
|
76 | + } |
|
77 | + } |
|
78 | + |
|
79 | + /** |
|
80 | + * Check if subpage's folder is a subfolder of parent page |
|
81 | + */ |
|
82 | + public function testHierarchy() |
|
83 | + { |
|
84 | + $parent = $this->objFromFixture('Page', 'parentpage'); |
|
85 | + $child = $this->objFromFixture('Page', 'subpage'); |
|
86 | + |
|
87 | + //test if fixtures are set up properly |
|
88 | + $this->assertEquals($parent->ID, $child->ParentID, 'subpage should be a child of parentpage'); |
|
89 | + |
|
90 | + $this->assertEquals( |
|
91 | + $parent->RootFolderID, |
|
92 | + $child->RootFolder()->ParentID, |
|
93 | + 'rootfolder2 should be a child of rootfolder 1' |
|
94 | + ); |
|
95 | + |
|
96 | + $newPage = Page::create(); |
|
97 | + $newPage->ParentID = $parent->ID; |
|
98 | + $newPage->Title = 'Hierarchy Test'; |
|
99 | + $newPage->urlSegment = 'hierarchy-test'; |
|
100 | + $newPage->write(); |
|
101 | + |
|
102 | + $this->assertEquals( |
|
103 | + $parent->RootFolderID, |
|
104 | + $newPage->RootFolder()->ParentID, |
|
105 | + 'new folder should be a child of page1 folder' |
|
106 | + ); |
|
107 | + } |
|
108 | + |
|
109 | + /** |
|
110 | + * Checks if getRootFolderName() works properly |
|
111 | + */ |
|
112 | + public function testGetRootFolderName() |
|
113 | + { |
|
114 | + $parent = $this->objFromFixture('Page', 'parentpage'); |
|
115 | + $child = $this->objFromFixture('Page', 'subpage'); |
|
116 | + |
|
117 | + //test if fixtures are set up properly |
|
118 | + $this->assertEquals($parent->ID, $child->ParentID, 'subpage should be a child of parentpage'); |
|
119 | + |
|
120 | + $this->assertStringEndsWith( |
|
121 | + $child->RootFolder()->Name . '/', |
|
122 | + $child->getRootFolderName(), |
|
123 | + 'FolderName should be at the end of getRootFolderName()' |
|
124 | + ); |
|
125 | + |
|
126 | + $root = Config::inst()->get('RootFolder', 'folder_root'); |
|
127 | + $this->assertStringStartsWith( |
|
128 | + $root . '/' . $parent->RootFolder()->Name, |
|
129 | + $child->getRootFolderName(), |
|
130 | + 'Parents FolderName should be at the beginning of getRootFolderName()' |
|
131 | + ); |
|
132 | + |
|
133 | + $this->assertStringStartsWith( |
|
134 | + ASSETS_DIR, |
|
135 | + $child->getRootFolderName(false), |
|
136 | + 'ASSETS_DIR should be at the beginning of getRootFolderName(false)' |
|
137 | + ); |
|
138 | + } |
|
139 | 139 | } |