1 <?php
2
3 4 5 6 7 8 9 10 11 12 13
14 abstract class CMSBatchAction extends Object {
15 16 17
18 abstract function getActionTitle();
19
20 21 22 23
24 abstract function getDoingText();
25
26 27 28 29
30 abstract function run(DataObjectSet $pages);
31
32 33 34 35 36 37 38 39
40 public function batchaction(DataObjectSet $pages, $helperMethod, $successMessage, $arguments = array()) {
41 $failures = 0;
42
43 foreach($pages as $page) {
44
45
46 if (call_user_func_array(array($page, $helperMethod), $arguments) === false) {
47 $failures++;
48 FormResponse::add("\$('sitetree').addNodeClassByIdx('$page->ID', 'failed');");
49 }
50
51
52
53 $publishedRecord = DataObject::get_by_id('SiteTree', $page->ID);
54 if ($publishedRecord) {
55 $JS_title = Convert::raw2js($publishedRecord->TreeTitle());
56 FormResponse::add("\$('sitetree').setNodeTitle($page->ID, '$JS_title');");
57 }
58 $page->destroy();
59 unset($page);
60 }
61
62 $message = sprintf($successMessage, $pages->Count()-$failures, $failures);
63
64 FormResponse::add('statusMessage("'.$message.'","good");');
65
66 return FormResponse::respond();
67 }
68
69
70
71 72 73 74 75 76 77 78
79 function applicablePagesHelper($ids, $methodName, $checkStagePages = true, $checkLivePages = true) {
80 if(!is_array($ids)) user_error("Bad \$ids passed to applicablePagesHelper()", E_USER_WARNING);
81 if(!is_string($methodName)) user_error("Bad \$methodName passed to applicablePagesHelper()", E_USER_WARNING);
82
83 $applicableIDs = array();
84
85 $SQL_ids = implode(', ', array_filter($ids, 'is_numeric'));
86 if (!$SQL_ids) return array();
87
88 $draftPages = DataObject::get("SiteTree", "\"SiteTree\".\"ID\" IN ($SQL_ids)");
89
90 $onlyOnLive = array_fill_keys($ids, true);
91 if($checkStagePages) {
92 foreach($draftPages as $page) {
93 unset($onlyOnLive[$page->ID]);
94 if($page->$methodName()) $applicableIDs[] = $page->ID;
95 }
96 }
97
98
99 if($checkLivePages && $onlyOnLive) {
100 $SQL_ids = implode(', ', array_keys($onlyOnLive));
101 $livePages = ($SQL_ids) ? Versioned::get_by_stage("SiteTree", "Live", "\"SiteTree\".\"ID\" IN ($SQL_ids)") : false;
102
103 if($livePages) foreach($livePages as $page) {
104 if($page->$methodName()) $applicableIDs[] = $page->ID;
105 }
106 }
107
108 return $applicableIDs;
109 }
110
111
112 function getParameterFields() {
113 return false;
114 }
115
116 117 118
119 function canView() {
120 return true;
121 }
122 }
123
124 125 126 127 128 129
130 class CMSBatchAction_Publish extends CMSBatchAction {
131 function getActionTitle() {
132 return _t('CMSBatchActions.PUBLISH_PAGES', 'Publish');
133 }
134 function getDoingText() {
135 return _t('CMSBatchActions.PUBLISHING_PAGES', 'Publishing pages');
136 }
137
138 function run(DataObjectSet $pages) {
139 return $this->batchaction($pages, 'doPublish',
140 _t('CMSBatchActions.PUBLISHED_PAGES', 'Published %d pages, %d failures')
141 );
142 }
143
144 function applicablePages($ids) {
145 return $this->applicablePagesHelper($ids, 'canPublish', true, false);
146 }
147 }
148
149 150 151 152 153 154
155 class CMSBatchAction_Delete extends CMSBatchAction {
156 function getActionTitle() {
157 return _t('CMSBatchActions.DELETE_DRAFT_PAGES', 'Delete from draft site');
158 }
159 function getDoingText() {
160 return _t('CMSBatchActions.DELETING_DRAFT_PAGES', 'Deleting selected pages from the draft site');
161 }
162
163 function run(DataObjectSet $pages) {
164 $failures = 0;
165
166 foreach($pages as $page) {
167 $id = $page->ID;
168
169
170 if($page->canDelete()) $page->delete();
171 else $failures++;
172
173
174 $liveRecord = Versioned::get_one_by_stage( 'SiteTree', 'Live', "\"SiteTree\".\"ID\"=$id");
175 if($liveRecord) {
176 $liveRecord->IsDeletedFromStage = true;
177 $title = Convert::raw2js($liveRecord->TreeTitle());
178 FormResponse::add("$('sitetree').setNodeTitle($id, '$title');");
179 FormResponse::add("$('Form_EditForm').reloadIfSetTo($id);");
180 } else {
181 FormResponse::add("var node = $('sitetree').getTreeNodeByIdx('$id');");
182 FormResponse::add("if(node && node.parentTreeNode) node.parentTreeNode.removeTreeNode(node);");
183 FormResponse::add("$('Form_EditForm').reloadIfSetTo($id);");
184 }
185
186 $page->destroy();
187 unset($page);
188 }
189
190 $message = sprintf(_t('CMSBatchActions.DELETED_DRAFT_PAGES', 'Deleted %d pages from the draft site, %d failures'), $pages->Count()-$failures, $failures);
191 FormResponse::add('statusMessage("'.$message.'","good");');
192
193 return FormResponse::respond();
194 }
195
196 function applicablePages($ids) {
197 return $this->applicablePagesHelper($ids, 'canDelete', true, false);
198 }
199 }
200
201 202 203 204 205 206
207 class CMSBatchAction_DeleteFromLive extends CMSBatchAction {
208 function getActionTitle() {
209 return _t('CMSBatchActions.DELETE_PAGES', 'Delete from published site');
210 }
211 function getDoingText() {
212 return _t('CMSBatchActions.DELETING_PAGES', 'Deleting selected pages from the published site');
213 }
214
215 function run(DataObjectSet $pages) {
216 $ids = $pages->column('ID');
217 $this->batchaction($pages, 'doUnpublish',
218 _t('CMSBatchActions.DELETED_PAGES', 'Deleted %d pages from the published site, %d failures')
219 );
220
221 foreach($ids as $pageID) {
222 $id = $pageID;
223
224
225 $stageRecord = Versioned::get_one_by_stage( 'SiteTree', 'Stage', "\"SiteTree\".\"ID\"=$id");
226 if($stageRecord) {
227 $stageRecord->IsAddedToStage = true;
228 $title = Convert::raw2js($stageRecord->TreeTitle());
229 FormResponse::add("$('sitetree').setNodeTitle($id, '$title');");
230 FormResponse::add("$('Form_EditForm').reloadIfSetTo($id);");
231 } else {
232 FormResponse::add("var node = $('sitetree').getTreeNodeByIdx('$id');");
233 FormResponse::add("if(node && node.parentTreeNode) node.parentTreeNode.removeTreeNode(node);");
234 FormResponse::add("$('Form_EditForm').reloadIfSetTo($id);");
235 }
236 }
237
238 return FormResponse::respond();
239 }
240
241 function applicablePages($ids) {
242 return $this->applicablePagesHelper($ids, 'canDelete', false, true);
243 }
244 }
245
246
247
248
[Raise a SilverStripe Framework issue/bug](https://github.com/silverstripe/silverstripe-framework/issues/new)
- [Raise a SilverStripe CMS issue/bug](https://github.com/silverstripe/silverstripe-cms/issues/new)
- Please use the
Silverstripe Forums to ask development related questions.
-