• Content count

  • Joined

  • Last visited

  • Days Won


gebeer last won the day on January 2 2017

gebeer had the most liked content!

Community Reputation

634 Excellent

About gebeer

  • Rank
    Distinguished Member

Profile Information

  • Gender
  • Location

Recent Profile Visitors

7,281 profile views
  1. Interesting discussion about extra address fields. I created a fieldtype 'AddressGeoNames' that consists of separate text inputs for country, city, postcode, lat, lng etc. where field values are verified and partially auto populated through API. This is a standalone Inputfield that geocodes through the google maps api. But it can also be connected to an InputfieldLeafletMapMarker field so that the given address will be rendered as pin on the map. The pin can also be manually repositioned and writes back lat/lng to the AddressGeonames field. I am currently using this in one live project with about 1500 users and they seem to get along fine with data input and geocoding. This is how it looks like when used next to a InputfieldLeafletMapMarker field: Planning on adding support for GoogleMapsMarker, too and eventually releasing it on github. Not quite ready yet, though. But if anyone is interested in the concept, I could share what I have so far.
  2. I can confirm that the module is still sending mails ok on my site. No errors.
  3. @patman I'd suggest making the PR to the original repo as this feature will be a good improvement to the original module.
  4. _js_geocode_address is used to hold the address that gets returned by the JS geocoding call, thats why the value is not set when rendering the field. This address is then stored to the data field in the DB on save. If you want to store the raw data in that data field, you also would need to change the schema, because it currently allows a max of 255 characters which will not be enough to store all the raw data. When you then retrieve the address in your template with $page->mylocationfieldname->address, it will return the raw data that you stored in that field. So you would need to extend the get method in LeafletMapMarker.php to return only the address and not the whole string. I think it would make more sense to extend the DB scheme and have a field raw that stores the raw data. You'd need a hidden field in the form, e.g. _js_geocode_raw that gets populated from the JS (just like the address field gets populated now) and then on save sends that value and stores it to the DB. You'd need to add that to the set method in LeafletMapMarker.php.
  5. @BrendonKoz Have you checked with some debug tool (I highly recommend Tracy Debugger Module) that $json['results'][0] has a value?
  6. @BrendonKoz The JS side of this module is using the OSM geocoder while the geocode() method in LeafletMapMarker.php is using the Google geocoder. If you wanted to save the raw data returned by Google geocoder, you would need to extend the database schema in FieldtypeLeafletMapMarker.module to add the necessary columns (e.g. streetAddress) to the table where data for this fieldtype ist stored. And extend the geocode method so it can save the raw data to the newly added columns. And add the respective keys to the construct method in LeafletMapMarker.php. Then you should be able to access your values in your template php like: $map = $modules->get('MarkupLeafletMap'); echo $map->streetAddress; and use those values to render the JSON+LD JS. You would either need to fork the original module and then add your code or write your own module that extends the original one and adds your methods.
  7. Hello, having the same problem as described by @Ivan Gretsky. Inside a namespaced module I have this method with a try catch block: public function addJson($pages, $filename) { $tmpPath = $this->files->tempDir('json'); try { $start = microtime(true); $jsondata = $this->getGeoJsonCollection($pages); $time = microtime(true) - $start; va_dump($time); // Note the intentional typo $filePath = $tmpPath . $filename; if($tmpPath && $jsondata) { //write json data into geojson.json file if(file_put_contents($filePath, $jsondata)) { $jsonPage = $this->jsonPage; $jsonPage->of(false); $file = $jsonPage->jsonfiles->getFile($filename); if($file) $jsonPage->jsonfiles->remove($file); $jsonPage->save(); $jsonPage->jsonfiles->add($filePath); $jsonPage->save(); if(!unlink($filePath)) $this->message("Error deleting temporary $filePath"); $this->message("$filename created and saved"); $this->log->save('json', "$filename created in $time seconds and saved"); return true; } else{ return false; } } } catch (\Exception $e) { $this->log->save('json', $e->getMessage()); } } I'm calling the module via command line from a worker php script that bootstraps PW. I get this ouput from my script and nothing logged to my custom json.text log file: PHP Fatal error: Call to undefined function ProcessWire\va_dump() in /var/www/ on line 208 Fatal error: Call to undefined function ProcessWire\va_dump() in /var/www/ on line 208 Error: Call to undefined function ProcessWire\va_dump() (line 208 of /var/www/ This error message was shown because: site is in debug mode. ($config->debug = true; => /site/config.php). Error has been logged. So it seems that WireException is catching this before my try catch.
  8. @BitPoet Thank you very much for the heads-up. Also to @Robin S. I finally ended up with this hook function in a module context which does exactly what I need, also in ajax mode: $this->addHookAfter('Field::getInputfield', $this, "lockConfirmedItems"); public function lockConfirmedItems(HookEvent $event) { if($this->user->isSuperuser() || $this->user->hasRole('certificationadmin')) return; $thisPage = wire('page'); // // Only run our locking logic if we are editing a user in the backend if($thisPage->process != "ProcessUser") return; $repeaterPage = $event->arguments(0); $context = $event->arguments(1); if($context != "_repeater" . $repeaterPage->id) return; if(!$repeaterPage->confirmed) return; $event->return->collapsed = 7; } Setting collapsed with the Inputfield constants like in BitPoet's code didn't work for me.
  9. Hello, I would like to prevent future editing of a repeater item once a checkbox in the repeater item has been checked. Either the form inputs of the repeater item should be read only or only the field values should be rendered. Looking at the module code I can't seem to figure out where to hook for that functionality. Any ideas would be much appreciated.
  10. @Pierre-Luc is there still no way to get feedback on success/errors when sending through the Mailgun API? I would like to build a Lister(Pro) Action around your module and for that I would like to show results after sending. Something like $mail->getResult(); in WireMailSMTP. EDIT: Guess I would need to use Mailgun Events for tracking emails. Right?
  11. Thank you for your suggestions. It is not that many mails, maybe a total of 100 a day and max 10-30 per hour. So I will stay with Gmail for the time being.
  12. @flydev That info is enlightening. Thank you! So I would have to extend the WireMailSmtp module to get that functionality, right? @horst
  13. I am experiencing problems when sending through Gmail on a site that is sending out quite a lot of emails to different recipients. It used to work for about a month and now suddenly Google is blocking my app. It seems that Google regards the app as less secure. I am wondering if someone has had similar issues with Gmail? I know there is a setting in Gmail to allow less secure apps. But I would like to know why Google thinks the app is less secure. Does it have something to do with headers being sent by WireMail that Google disqualifies as insecure? Here is the data array from the WireMailSmtp object (sensitive data has been replaced by xxx): default_charset => "UTF-8" (5) localhost => "" (31) smtp_host => "" (14) smtp_port => 587 smtp_ssl => "" smtp_start_tls => 1 smtp_user => "" (32) smtp_password => "xxx" (11) smtp_password2 => "" clear_smtp_password => "" realm => "" workstation => "" authentication_mechanism => "" smtp_debug => 0 smtp_html_debug => 0 sender_name => "xxx" (24) sender_email => "" (32) sender_reply => "" sender_errors_to => "" sender_signature => "" sender_signature_html => "" send_sender_signature => "1" extra_headers => "" valid_recipients => "" smtp_certificate => "" And here the mail object data to => array (2) "" => "" (26) "" => "" (28) toName => array (2) "" => "" "" => "" cc => array () ccName => array () bcc => array () from => "" (32) fromName => "xxx" (24) priority => "" dispositionNotification => "" subject => "xxx" (51) body => "This is an automatically created email. Please do not reply. xxx" (139) bodyHTML => "xxx" (183) addSignature => NULL attachments => array () header => array (1) "X-Mailer" => "ProcessWire/WireMailSmtp" (24) sendSingle => FALSE sendBulk => FALSE useSentLog => FALSE wrapText => FALSE Does anyone have an idea why Gmail thinks these mails are less secure?
  14. Hi, I had the same situation as the OP described: URL sent by email to go to a specific page after login. I solved it with 2 small hooks that I added to a module. You could also add them to your admin.php or ready.php My URL looks like .../?member=1222 where 1222 is the id of a user 1. hook adds a session variable before Login $this->addHookBefore('ProcessLogin::execute', $this, 'setRedirectId'); public function setRedirectId(HookEvent $event) { if($this->input->get('member')) { $this->session->set('goToMember', $this->sanitizer->int($this->input->get('member')); } } 2. hook has the redirect logic and removes the session variable $this->addHookAfter('Session::login', $this, 'loginRedirects'); public function loginRedirects(HookEvent $event) { if($this->user->hasRole('certificationadmin') && $this->session->get('goToMember')) { $member = $this->pages->get($this->session->get('goToMember')); if($member && $member->id) { $this->session->remove('goToMember'); $this->session->redirect($member->statusPageUrl); // statusPageUrl is a custom property for users that I added via another hook } } }
  15. The problem in my case is that this project will have more than 2000 users that will logon from all over the world. So I guess I will have to disable session fingerprinting to make sure that everyone can connect without issues.