toni Posted April 6, 2022 Share Posted April 6, 2022 Hi, sorry if this might be a super easy one but I couldn't find and answer in https://github.com/processwire/processwire/blob/master/wire/core/Process.php In a custom backend module I can just return html that gets rendered. How would I create a json endpoint that can be used from other pages of my module? This is what I've tried public function ___executejson() { return json_encode(array("a"=>"b")); } And from I an other page in frontend fetch('http://localhost/pw-dev/processwire/test-list/json') .then(response => response.json()) .then(commits => console.log(commits)); Obviously this is the wrong way. Thanks a lot for your hints Toni Link to comment Share on other sites More sharing options...
kongondo Posted April 6, 2022 Share Posted April 6, 2022 1 hour ago, toni said: And from I an other page in frontend You cannot reach a backend page -> Process, Setup, etc from the frontend like that. There are various alternatives. A recent one is URL hooks. 1 Link to comment Share on other sites More sharing options...
toni Posted April 7, 2022 Author Share Posted April 7, 2022 thanks @kongondo Link to comment Share on other sites More sharing options...
toni Posted April 7, 2022 Author Share Posted April 7, 2022 Wow this is fantastic! @kongondo May I ask, do you know of an example where I can see how to correctly set a hook like I've tried within the init method but it does not what I would expect: class ProcessMyModule extends Process { public function init() { $wire->addHook('/hello/world', function($event) { return 'Hello World'; }); } ... Link to comment Share on other sites More sharing options...
Zeka Posted April 7, 2022 Share Posted April 7, 2022 (edited) Hi @toni. Process modules is intended to be used in admin and they are not autoloaded, so for such hook you can create an satelite autoload module or put this code to init.php file. class URLHooker extends WireData implements Module { public static function getModuleInfo() { return array( 'title' => 'URLHooker', 'version' => '0.1', 'singular' => true, 'autoload' => true, 'requires' => [ 'YourProcessModule>=0.1' ], ); } public function init() { $this->wire()->addHook('/hello/world', function($event) { return 'Hello World'; }); } } Edited April 7, 2022 by kongondo Fixed unmatched apostrophe in code 2 Link to comment Share on other sites More sharing options...
kongondo Posted April 7, 2022 Share Posted April 7, 2022 @toni, What @Zeka said. You'd need an autoload module for this otherwise your hook would only run when your module is loaded which will be too late. Although this is not explicit in the blog post I linked to, it does mention autoload module. Link to comment Share on other sites More sharing options...
toni Posted April 8, 2022 Author Share Posted April 8, 2022 Ok got thanks a lot to both of you, I've tested with the autoload bool but did not know that it does not work with backend modules. Am I right that backend modules are defined by extending Process where 'satelite autoload modules' extend Module? Thanks a lot for your patience and help! – T Link to comment Share on other sites More sharing options...
kongondo Posted April 8, 2022 Share Posted April 8, 2022 (edited) 2 hours ago, toni said: I've tested with the autoload bool but did not know that it does not work with backend modules It does work with backend modules ?. The distinction in this case is not about backend or frontend. It is about autoload. Since Process modules are backend applications that you use on demand, there is no compelling reason to have them autoload. Hence, in your case the suggestion to create a module that autoloads and is dedicated to handling the URL hooks. 2 hours ago, toni said: Am I right that backend modules are defined by extending Process where 'satelite autoload modules' extend Module? Not really. There are different types of so-called backend modules, including Process, AdminTheme, Inputfield, etc. All modules have to implement the Module interface. In some cases they may not do it directly but do so via the parent class they are inheriting. For instance, you will find InputfieldFile extends Inputfield. Inputfield in turn extends WireData and implements Module. Technically, there are no 'satellite' modules. This term was just used in reference to having something on the side that is not part of the main thing (hope this makes sense). So, your 'satellite' module, given that it autoloads without restrictions, is both a backend and a frontend module. You can make it autoload based on some conditions if you wish, e.g. in the backend only, or frontend only, or for some templates only, etc. The following documentation will give you a better understanding of modules. https://processwire.com/docs/modules/ https://processwire.com/api/ref/module/ Edited April 8, 2022 by kongondo Link to comment Share on other sites More sharing options...
toni Posted April 8, 2022 Author Share Posted April 8, 2022 thank you so much @kongondo now it is clear! Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now