Jump to content


  • Posts

  • Joined

  • Last visited

Everything posted by androbey

  1. Very nice, thank you! This helps me a lot. Just as a side note: As I have multiple options fields on the same page I'd have to add an additional name selector to the input selector ($('input[name="roles[]"][value=1]') of course escaped).
  2. Hi all, I have a rather special problem (at least for me) and did not find a proper way to solve it. On the system user template I have multiple "Options/Checkboxes" fields (multiple selectable values), where each field could have up to 30 options. Now, it would be a lot of work to click many checkboxes, especially when there are a lot of users. What I would like to have is a button (or multiple buttons) next to the field to set default values (e.g. button "Option 1" would select certain fields and button "Option 2" would select even more fields). Default value sets and selectable options are static. Is there any (good) way to accomplish this? Unfortunately there's is no real dependency which default set should be used (if any), so no after save hook or similiar is suitable. It's totally up to the editor which default set should be used on a per user basis. Hope this makes sense.
  3. Hi @benbyf Maybe this module does help you too:
  4. Hi @adrian, first of all, thank you for your support and the Slack enhancement. I think it's a good fit, but noticed that mail support has "disappeared" (so if logging to Slack is enabled, no more mail is sent - the Slack logger replaces the mail dispatch entirely). It's probably nothing anybody else would use, nor that there's any real need for it (besides my imaginations): So here's my suggestion or better my ideas to even further improve your must-have module. I think it would be great, if you could add a new hookable function, let's say /** * Empty hookable function. * Use hook before TracyDebugger:addCustomLogger to add your own logger */ protected function ___addCustomLogger() { //empty on purpose } and call this method right after you currently call the Slack logger. Then you would be able to add your custom logger module (for example) which takes care entirely of logging. Advantages of this approach: Very custom error handlers would be possible (maybe some internal monitoring tools), you could decide when to use which service (e.g. mail on exceptions, Slack message on anything else) and so on (or even use many services to spam you all at once). I tried this approach with a quick and dirty module, which one would have to keep in mind that autoload priority has to be higher than TracyDebuggers' AND to not have TracyDebugger as a module requirement itself. Unfortunately I am still no expert, but it would be nice to hear your feedback on this.
  5. Hi @adrian, thanks for your fast response. Super nice to hear it's on your list. I agree, a throttle (or an option to throttle) would still be important. But for dedicated and muted "monitoring" channels maybe not that much contrary to mail inbox.
  6. Hi, I don't know if this is the right place to ask this, but I hope so. Tracy Debugger is of course excellent and a must have for each site. Right now I am using the "email notification" feature, but with Tracy's "email-sent"-flag I'd have to manually check the log file, if some error ocurred in the meantime. I was wondering if there is any possibility to add an additional logger besides the log file, which has no "throttle", e.g. something like a Slack logger (https://tracy.nette.org/en/recipes#toc-custom-logger) (without the need to adjust the module myself). Hope this makes sense. Thanks in advance!
  7. I can give you a simple example how to use the options array. In this example you would get all log entries for your log file that have been stored today. $entries = $log->getEntries("simplecontactform-log", ["dateFrom" => "2022-06-14 00:00", "dateTo" => "2022-06-14 23:59:59"]); foreach($entries as $entry){ //get log entry text, you can also get date, user and url $text = $entry["text"]; }
  8. @Flashmaster82 Have a look at the documentation for the getEntries() method here: https://processwire.com/api/ref/wire-log/get-entries/ You have the ability to specify an options array, where you can limit the returned entries (e.g. getting only log entries from a certain date onwards).
  9. You are calling information about all logs. What you need instead is described here: https://processwire.com/api/ref/wire-log/get-entries/ or https://processwire.com/api/ref/wire-log/get-lines/ In your case e.g.: <?php $myLogs = $logs->getLines("simplecontactform-log"); //do stuff with single lines (inside $myLogs array)..
  10. Hi @BitPoet, thank you, this helped and fixed my problem.
  11. Hi @BitPoet, thanks for your help. Calling $modules->get('myfieldtype') does the trick (although it's a little cumbersome to add it everywhere before I'm using this fieldtype via the API). However, I don't understand your second suggestion. Event and EventArray are classes which extend WireData/WireArray, how could they be autoloaded? Setting autoload to true in both FieldtypeEvents and InputfieldEvents (just to make sure) has no positive effect.
  12. Hi all, I created a custom Fieldtype / Inputfield combo (similiar to https://processwire.com/modules/fieldtype-events/) and also want to add content to this fieldtype via API. Now, with lazy loading enabled I get the error that class is not found. //will throw an error here.. Class ProcessWire\Event not found. $event = new Event(); With lazy loading disabled via config.php everything works well. Is there any way to "register" or make ProcessWire aware to actually load this class or any other workaround (besides disabling lazy loading)?
  13. @Ralf You're right, my bad. It seems "isChanged()" method does not work on User template. But you still have two options. 1) Tweek the code from above and check if the field you want to monitor is in changes array. (e.g. in_array('roles', $changes)). 2) Use a slightly different approach with User::changed hook. You have to modify to fit your needs, but here's a very basic example. wire()->addHookAfter('User::changed', function (HookEvent $event) { $user = $event->object; $changedField = $event->arguments(0); //which field you want to monitor $fieldToCheck = "roles"; if ($fieldToCheck == $changedField) { //send mail.. or do more checks.. } $return = $event->return; $event->return = $return; }); Edit: the second approach is ONLY sensible if you want to check for a single changed field! Otherwise you would get a mail for each changed field. If you want to check for changes of more than one field use the first approach.
  14. Hi Ralf, e.g. you could check if the field you are looking for (e.g. roles) has changed: https://processwire.com/api/ref/page/is-changed/ .. and then only send an email if the field has changed.
  15. Hey @Sebi, thanks for looking into the issue. You are absolutley right, when specifying it as a GET parameter it works without issues. This is anyhow the better way. Thank you again ?
  16. Hi @Sebi, thank you for your response. That was the first thing I checked. For the API request I am using vanilla JS (fetch) and I'm using the encodeURIComponent() function. Also in network tab in dev tools I can see the request is transmitted as it should be according to RFC 3986. I would digg deeper, but I don't know where the status code gets injected for a (in fact) successful request.
  17. I am using AppAPI module for a project and it's amazing. Thanks @Sebi! However I encountered a (for me) very strange behaviour. I defined an endpoint for a search functionality (for use via ajax). //... //defined route in Router.php 'search' => [ ['GET', '{q}', Search::class, 'getSearchResults', ["auth" => true]], ], I call the endpoint via ajax (content type application/json). The "q" parameter is free text and uri encoded. Now, when "q" is a single word no problem occurs. However if "q" has a space like "my query" the response has a HTTP status code 404, although returning the correct results. So the route itself is working fine. I am not sure what causes this. Has anybody some clues? used versions: AppAPI 1.1.7, ProcessWire 3.0.184, Php 7.4
  18. Hi @Marcel, you can find the "AppAPI" config page with following schema: {{YOUR_DOMAIN_COM}}/{{ADMIN_PATH}}/{{SETUP_PATH}}/appapi/ For a "default" ProcessWire installation on "example.com" this would be: https://example.com/processwire/setup/appapi/ There you need to manage your applications. Then, in your Router.php file you need to define routes (=endpoints).
  19. Ok you try to bind the value to an element with id "map2", but you don't have an element with that id. Your input element probably needs that id: <input type="hidden" name="map2" id="map2">
  20. Hi @webhoes, it can be that I am overlooking something, but as far as I can see you don't have a "name" attribute called "update" in your button element. So your if statement never evaluates to true.
  21. Maybe that's what you are looking for: https://processwire.com/blog/posts/pw-3.0.137/#on-demand-mirroring-of-remote-web-server-files-to-your-dev-environment
  22. I still don't get why I am logged out of site2 when "force login" on site1, but replacing $site1->session->forceLogin($userSite1); //with following (replacement): $site1->session->setCurrentUser($userSite1); seems to have the desired effect without logging out the user on site2.
  23. Hi all, I have a special setup right now, which uses two ProcessWire instances with two different databases (no "multi-site" setup), let's call them site1 and site2. I want to access data from site1 on site2 through the multi-instance feature. It happens that some users of site2 may have an account on site1 as well and for them I store their user id on site2. Now I want to force login those users, when I want to use a page find function. This way I can still manage access to pages on site1. If I don't login those users on site1, no results are returned for access controlled pages, unless I add the check_access flag to 0 (which I want to avoid). So far so good. However, once I force login those users on site1 the user is logged out of site2 automatically (which means the user acctually cannot use the site). Both sites are running exact same versions (v 3.0.178) and have different sessions names. // on site2 $path = '/home/modules/www/site1'; // The root URL for the PW installation $url = 'http://examplesite1.com'; // Create a new ProcessWire instance $site1 = new ProcessWire($path, $url); //get user object from site1 -> "$userSite1" //force login user.. $site1->session->forceLogin($userSite1); $myPages = $site1->pages->find("template=my_access_controlled_template"); // pages are returned that $userSite1 has access to //at this stage currently logged-in $user of site2 is logged out I hope the problem is clear. Is there anything I can do to avoid the log out (without having to use check_access flag)?
  24. Hi all, I am once again seeking for help or at least some hints. I have the following "problem": I want to allow users to enable two-factor authentication from the frontend. So they should only be presented an option to enable TOTP (display QR code/secret and code input element) - no other profile edit related stuff is needed. I looked at the "TfaTotp" module class and I am not sure if one could use it in the frontend at all (as it seems to heavily rely on the user profile form in the backend). So my main question is: Is it possible to use this class for my usecase in the frontend without changing the code / duplicating it?
  25. @Adam Thank you! It works very well now. I also tried to include it on a front end login page (which does not use the Login/Register (pro) module). With the example in the Tfa class the authorization form was never called and I figured it was because the tfa token changed because tfa's success method was called without tfa being started yet. So the token was reset and hence mismatched with the token in the get variable. Using a new session variable did the trick. I thought I'd share this if anyone also comes across this. $tfa = new Tfa(); $tfaStarted = $session->get('tfa_started'); if ($tfaStarted && $tfa->success()) { //redirect to some page if logged in $session->redirect('/some/page'); } else if ($tfa->active()) { //only set this variable if $tfa->active() is true. That also means the auth form is rendered. $session->set('tfa_started', true); //echo the form somewhere in your HTML $tfaRender = $tfa->render(); } else if ($input->post('login_request')) { //get input name and password (also CSRF token...) $inputName = $input->post('user_name'); $inputPassword = $input->post('user_password'); $tfa->start($inputName, $inputPassword); $session->remove('tfa_started'); /* do regular login stuff here if user has no 2FA set up */ } else { // render login form if ($session->get('tfa_started')) { //remove session variable and reload page (otherwise $tfa->success() would be called) $session->remove('tfa_started'); $session->redirect($page->url); } } /* don't forget to include scripts in your HTML markup <script src="<?= $config->urls->siteModules ?>TfaU2F/u2f-api/u2f-api-polyfill.js"></script> <script src="<?= $config->urls->siteModules ?>TfaU2F/TfaU2F.js"></script> */
  • Create New...