@@ -17,24 +17,24 @@ class Action
1717 /**
1818 * Returns a Datastar action.
1919 */
20- public static function getAction (string $ method , string $ route , array $ params = [], array $ options = []): string
20+ public static function getAction (string $ method , string $ route , array $ params = [], array | string $ options = []): string
2121 {
2222 $ url = self ::getUrl ($ route , $ params );
23- $ args = [" ' $ url' " ];
23+ $ args = [' " ' . $ url . ' " ' ];
2424
2525 if ($ method !== 'get ' ) {
26- $ headers = $ options[ ' headers ' ] ?? [] ;
27- $ headers [Request:: CSRF_HEADER ] = Craft:: $ app -> getRequest ()-> getCsrfToken ();
28- $ options[ ' headers ' ] = $ headers ;
26+ $ options = self :: addCsrfToken ( $ options) ;
27+ } else {
28+ $ options = is_array ( $ options ) ? Json:: encode ( $ options ) : $ options ;
2929 }
3030
31- if (! empty ( $ options) ) {
32- $ args [] = Json:: encode ( $ options) ;
31+ if ($ options !== ' {} ' ) {
32+ $ args [] = $ options ;
3333 }
3434
3535 $ args = implode (', ' , $ args );
3636
37- return " @ $ method( $ args) " ;
37+ return ' @ ' . $ method . ' ( ' . $ args . ' ) ' ;
3838 }
3939
4040 /**
@@ -56,4 +56,46 @@ public static function getUrl(string $route, array $params = []): string
5656 'config ' => $ config ->getHashed (),
5757 ]);
5858 }
59+
60+ private static function addCsrfToken (array |string $ options ): string
61+ {
62+ $ token = Craft::$ app ->getRequest ()->getCsrfToken ();
63+ $ csrfHeader = Request::CSRF_HEADER ;
64+
65+ if (is_array ($ options )) {
66+ return self ::addCsrfToArray ($ options , $ token , $ csrfHeader );
67+ }
68+
69+ return self ::addCsrfToString ($ options , $ token , $ csrfHeader );
70+ }
71+
72+ private static function addCsrfToArray (array $ options , string $ token , string $ csrfHeader ): string
73+ {
74+ $ headers = $ options ['headers ' ] ?? [];
75+ $ headers [$ csrfHeader ] = $ token ;
76+ $ options ['headers ' ] = $ headers ;
77+
78+ return Json::encode ($ options );
79+ }
80+
81+ private static function addCsrfToString (string $ options , string $ token , string $ csrfHeader ): string
82+ {
83+ if (preg_match ('/headers:\s*\{/i ' , $ options )) {
84+ return preg_replace (
85+ '/headers:\s*\{/i ' ,
86+ 'headers: {" ' . $ csrfHeader . '": " ' . $ token . '", ' ,
87+ $ options
88+ );
89+ }
90+
91+ if (preg_match ('/}\s*$/ ' , $ options )) {
92+ return preg_replace (
93+ '/}\s*$/ ' ,
94+ ', headers: {" ' . $ csrfHeader . '": " ' . $ token . '"}} ' ,
95+ $ options
96+ );
97+ }
98+
99+ return Json::encode (['headers ' => [$ csrfHeader => $ token ]]);
100+ }
59101}
0 commit comments