10
10
class MarkdownExtension extends DataExtension {
11
11
12
12
private static $ replace_html_fields = true ;
13
+ private static $ db_field_cache = array ();
14
+ private static $ disable_markdown_fields = false ;
13
15
14
- public static function ReplaceHTMLFields (){
15
- if (Config::inst ()->get ('MarkdownExtension ' , 'replace_html_fields ' )){
16
- $ classes = ClassInfo::subclassesFor ('DataObject ' );
17
- foreach ($ classes as $ className ){
18
- if ($ db = Config::inst ()->get ($ className , 'db ' )){
19
- if (in_array ('HTMLText ' , $ db )){
20
- $ updateDB = array ();
21
- foreach ($ db as $ field => $ type ){
22
- $ newType = $ type ;
23
- if (strpos ($ type , 'HTMLText ' ) !== false ){
24
- $ newType = str_replace ($ type , 'HTMLText ' , 'MarkdownText ' );
25
- }
26
- if (strpos ($ type , 'HTMLVarchar ' ) !== false ){
27
- $ newType = str_replace ($ type , 'HTMLVarchar ' , 'MarkdownVarchar ' );
28
- }
29
-
30
- $ updateDB [$ field ] = $ newType ;
31
- }
32
-
33
- Config::inst ()->update ($ className , 'db ' , $ updateDB );
34
- }
16
+ protected static function without_markdown_fields ($ callback ) {
17
+ $ before = self ::$ disable_markdown_fields ;
18
+ self ::$ disable_markdown_fields = true ;
19
+ $ result = $ callback ();
20
+ self ::$ disable_markdown_fields = $ before ;
21
+ return $ result ;
22
+ }
23
+
24
+
25
+ public static function get_db_fields_for_class ($ class )
26
+ {
27
+ if (isset (self ::$ db_field_cache [$ class ])) {
28
+ return self ::$ db_field_cache [$ class ];
29
+ }
30
+ $ db = self ::without_markdown_fields (function () use ($ class ) {
31
+ return DataObject::custom_database_fields ($ class );
32
+ });
33
+ self ::$ db_field_cache [$ class ] = $ db ;
34
+ return self ::$ db_field_cache [$ class ];
35
+ }
36
+
37
+
38
+ public static function get_extra_config ($ class , $ extension , $ args ) {
39
+ if (!self ::$ replace_html_fields ) return array ();
40
+ if (self ::$ disable_markdown_fields ) return array ();
41
+
42
+ $ config = Config::inst ();
43
+ // Merge all config values for subclasses
44
+ foreach (ClassInfo::subclassesFor ($ class ) as $ subClass ) {
45
+ $ db = self ::get_db_fields_for_class ($ subClass );
46
+ $ updated = false ;
47
+ foreach ($ db as $ field => $ type ){
48
+ if (strpos ($ type , 'HTMLText ' ) !== false ){
49
+ $ updated = true ;
50
+ $ db [$ field ] = str_replace ($ type , 'HTMLText ' , 'MarkdownText ' );
35
51
}
52
+ if (strpos ($ type , 'HTMLVarchar ' ) !== false ){
53
+ $ updated = true ;
54
+ $ db [$ field ] = str_replace ($ type , 'HTMLVarchar ' , 'MarkdownVarchar ' );
55
+ }
56
+ }
57
+ if ($ updated ){
58
+ $ config ->update ($ subClass , 'db ' , $ db );
36
59
}
37
60
}
61
+ // Force all subclass DB caches to invalidate themselves since their db attribute is now expired
62
+ DataObject::reset ();
38
63
}
39
64
65
+
40
66
public function updateCMSFieldSecondary (FieldList $ fields ){
41
67
$ this ->updateCMSFields ($ fields );
42
68
}
43
69
70
+
44
71
public function updateCMSFields (FieldList $ fields ){
45
72
if (Config::inst ()->get ('MarkdownExtension ' , 'replace_html_fields ' )){
46
73
foreach ($ fields ->dataFields () as $ field ) {
@@ -54,4 +81,5 @@ public function updateCMSFields(FieldList $fields){
54
81
}
55
82
}
56
83
84
+
57
85
}
0 commit comments