1 <?php
2 3 4 5
6 abstract class StaticPublisher extends DataObjectDecorator {
7 8 9 10 11
12 static $echo_progress = false;
13
14 15 16 17
18 static $disable_realtime = false;
19
20 21 22 23 24
25 static $static_publisher_theme=false;
26
27 abstract function publishPages($pages);
28 abstract function unpublishPages($pages);
29
30 static function echo_progress() {
31 return (boolean)self::$echo_progress;
32 }
33
34 35 36 37
38 static function set_echo_progress($progress) {
39 self::$echo_progress = (boolean)$progress;
40 }
41
42 43 44
45 function onAfterPublish($original) {
46 $this->republish($original);
47 }
48
49 50 51 52 53 54
55 function onRenameLinkedAsset($original) {
56 $this->republish($original);
57 }
58
59 function republish($original) {
60 if (self::$disable_realtime) return;
61
62 $urls = array();
63
64 if($this->owner->hasMethod('pagesAffectedByChanges')) {
65 $urls = $this->owner->pagesAffectedByChanges($original);
66 } else {
67 $pages = Versioned::get_by_stage('SiteTree', 'Live', '', '', '', 10);
68 if($pages) {
69 foreach($pages as $page) {
70 $urls[] = $page->AbsoluteLink();
71 }
72 }
73 }
74
75
76 foreach($urls as $i => $url) {
77 if(!is_string($url)) {
78 user_error("Bad URL: " . var_export($url, true), E_USER_WARNING);
79 continue;
80 }
81
82
83 if(substr($url,-1) == '/' && $url != '/') $url = substr($url,0,-1);
84
85 $urls[$i] = $url;
86 }
87
88 $urls = array_unique($urls);
89
90 $this->publishPages($urls);
91 }
92
93 94 95 96
97 function onAfterUnpublish($page) {
98 if (self::$disable_realtime) return;
99
100
101 if($this->owner->hasMethod('pagesAffectedByUnpublishing')) {
102 $urls = $this->owner->pagesAffectedByUnpublishing();
103 $urls = array_unique($urls);
104 } else {
105 $urls = array($this->owner->AbsoluteLink());
106 }
107
108 $legalPages = singleton('Page')->allPagesToCache();
109
110 $urlsToRepublish = array_intersect($urls, $legalPages);
111 $urlsToUnpublish = array_diff($urls, $legalPages);
112
113 $this->unpublishPages($urlsToUnpublish);
114 $this->publishPages($urlsToRepublish);
115 }
116
117 118 119
120 function externalReferencesFor($content) {
121 $CLI_content = escapeshellarg($content);
122 $tidy = `echo $CLI_content | tidy -numeric -asxhtml`;
123 $tidy = preg_replace('/xmlns="[^"]+"/','', $tidy);
124 $xContent = new SimpleXMLElement($tidy);
125
126
127 $xlinks = array(
128 "//link[@rel='stylesheet']/@href" => false,
129 "//script/@src" => false,
130 "//img/@src" => false,
131 "//a/@href" => true,
132 );
133
134 $urls = array();
135 foreach($xlinks as $xlink => $assetsOnly) {
136 $matches = $xContent->xpath($xlink);
137 if($matches) foreach($matches as $item) {
138 $url = $item . '';
139 if($assetsOnly && substr($url,0,7) != 'assets/') continue;
140
141 $urls[] = $url;
142 }
143 }
144
145 return $urls;
146 }
147
148 function set_static_publisher_theme($theme){
149 self::$static_publisher_theme=$theme;
150 }
151
152 function static_publisher_theme(){
153 return self::$static_publisher_theme;
154 }
155 }
156
157 ?>
[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.
-