Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 04/12/2019 in all areas

  1. File Info A textformatter module for ProcessWire. The module can add information to local Pagefile links in two ways: As extra markup before, within or after the link As data attributes on the link (handy if you want to use a Javascript tooltip library, for instance) Screenshots Module config Example of output Installation Install the File Info module. Add the textformatter to one or more CKEditor fields. Configuration Add markup action (and general) Select "Add markup to links" Select the Pagefile attributes that will be retrieved. The attribute "filesizeStrCustom" is similar to the core "filesizeStr" attribute but allows for setting a custom number of decimal places. If you select the "modified" or "created" attributes then you can define a date format for the value. Enter a class string to add to the links if needed. Define the markup that will be added to the links. Surround Pagefile attribute names in {brackets}. Attributes must be selected in the "Pagefile attributes" section in order to be available in the added markup. If you want include a space character at the start or end of the markup then you'll need >= PW 3.0.128. Select where the markup should be added: prepended or appended within the link, before the link, or after the link. Add data attributes action Select "Add data attributes to links" Select the Pagefile attributes that will be retrieved. These attributes will be added to the file links as data attributes. Attributes with camelcase names will be converted to data attribute names that are all lowercase, i.e. filesizeStrCustom becomes data-filesizestrcustom. Hook If you want to customise or add to the attributes that are retrieved from the Pagefile you can hook TextformatterFileInfo::getFileAttributes(). For example: $wire->addHookAfter('TextformatterFileInfo::getFileAttributes', function(HookEvent $event) { $pagefile = $event->arguments(0); $page = $event->arguments(1); $field = $event->arguments(2); $attributes = $event->return; // Add a new attribute $attributes['sizeNote'] = $pagefile->filesize > 10000000 ? 'This file is pretty big' : 'This file is not so big'; $event->return = $attributes; }); https://github.com/Toutouwai/TextformatterFileInfo https://modules.processwire.com/modules/textformatter-file-info/
    17 points
  2. Work continued in closing out issue reports this week. We’re down to about 60 of them now, though if we subtract issues that aren’t reproducible, are already marked as resolved (close pending), may be moved to the request repo, or are a discussion (rather than something to fix), then we’re closer to half that number. Over these last few weeks we’ve been working on issue reports, but I’ve also been enhancing the core in small ways as well. This post will cover a few of the useful enhancements that have been made in recent weeks— https://processwire.com/blog/posts/pw-3.0.130/
    14 points
  3. Holiday bookings - here's a video (no sound, so might have to guess what I was doing in places!) showing backend management of calendars (so in this example two holiday cottages/apartments) and different fee structures per cottage/apartment throughout the year for different seasons (though I'd probably approach that differently now). For the backend I made it possible to click and drag so you can select an odd number of days for a booking as a member of a sales team if you're taking a booking over the phone. On the frontend calendar (not in this video) the customer can only pick from pre-defined dates that are availble. You'll see some dates has bookings (Burlingham - my surname) and clicking on those takes you to the booking details - obviously customers viewing the frontend wouldn't see the other booking details ? It doesn't show the whole parment process but I think that was because it wasn't working with the Reno admin theme at the time I last looked at this code in 2016. I think to be honest I'd forgotten how interesting some of the things were that I'd done on here that the event calendar is probably the one to do first, followed by this accomodation booking one.
    3 points
  4. Hi folks I've worked on a number of projects over the years where I've got various chunks of code I think would make some really nice ProcessWire modules. They do lean more towards commercial modules though as they are quite complex and I need to be able to support them and there would be improvements over time. I'm trying to gauge interest though before actually choosing one, so if you have ever come across a client wanting any of the module ideas listed in this poll please do vote and comment if you come across a need for these regularly (possibly you won't with the first three as they're all quite niche :)). Other ideas are welcome of course if you regularly have a need for something - I'm not afraid to admit I'm trying to build up some recurring revenue here!
    2 points
  5. With all the hype around headless CMS, maybe a new GraphQL module? The only one we already have, uses an abandoned PHP library, and is much too slow for productive use imho.
    2 points
  6. The TfaTotp module is not a core module so it won't be covered in the core docs. The base Tfa class is in the API docs here: https://processwire.com/api/ref/tfa/ There's no tutorial AFAIK but you can refer to the implementation in ProcessLogin and there is a basic usage example given in the comments for Tfa.php: * USAGE * ~~~~~~ * $tfa = new Tfa(); * * if($tfa->success()) { * $session->redirect('after/login/url/'); * * } else if($tfa->active()) { * echo $tfa->render(); * * } else if($input->post('submit_login')) { * $name = $input->post('name'); * $pass = $input->post('pass'); * $tfa->start($name, $pass); * * // the start() method performs a redirect if TFA is active for the user * // place your regular code to login user here, which will be used if TFA is not active for the user * * } else { * // render login form * } Also see the introductory blog post for info about how the TFA selection field is added to the user template: https://processwire.com/blog/posts/processwire-3.0.109-adds-two-factor-authentication/
    2 points
  7. Anyone else looking for a solution for bootstrap navigation? I have found this wiki but it´s not working: http://wiki.processwire.com/index.php/Bootstrap_Navbar#The_Navbar Here is my modified solution, I hope there are no bug´s. The Navbar <nav class="navbar navbar-default"> <div class="container-fluid"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Navigation ein-/ausblenden</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="#"><img src="#" alt="Logo"></a> </div> <div lass="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <?php include("topnav.inc"); ?> </div><!--/.nav-collapse --> </div> </nav><!-- /navbar --> The Menu content of ('topnav.inc') <?php /* Navigation for ProcessWire using the Bootstrap 3.5 markup This menu was written by Soma based on work by NetCarver and a bit thrown in by Joss | modified by David Schmidt */ function renderChildrenOf($pa, $output = '', $level = 0) { $output = ''; $level++; foreach($pa as $child) { $atoggle = ''; $class = ''; if ($child->numChildren && count($child->parents) == 1) { $class .= 'dropdown'; $atoggle .= ' class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" '; } else if($child->numChildren && $child->id != 1){ $class .= 'dropdown-menu'; } // Makes the current page and it's top level parent add an active class $class .= ($child === wire("page") || $child === wire("page")->rootParent) ? " active" : ''; $class = strlen($class) ? " class='".trim($class)."'" : ''; if ($child->numChildren && count($child->parents) >= 1) { $output .= "<li$class><a href='$child->url'$atoggle>$child->title<span class='caret'></span></a>"; } else{$output .= "<li$class><a href='$child->url'$atoggle>$child->title</a>";} // If this child is itself a parent and not the root page, then render it's children in their own menu too... if($child->numChildren && $child->id != 1) { $output .= renderChildrenOf($child->children, $output, $level); } $output .= '</li>'; } $outerclass = ($level == 1) ? "nav navbar-nav" : 'dropdown-menu'; return "<ul class='$outerclass'>$output</ul>"; } // bundle up the first level pages and prepend the root home page $homepage = $pages->get(1); $pa = $homepage->children; $pa = $pa->prepend($homepage); // Set the ball rolling... echo renderChildrenOf($pa); ...do something great with it. Regards David
    1 point
  8. Is it possible to automate the installation process of PW? With WordPress and thanks to [wp-cli](https://wp-cli.org/) I can automate the installation and configuration of my installation with a simple bash-script. Is something like that possible with ProcessWire, too? In other words: Is there a way to install PW purely through commands on the command line without having to go through the installation wizard first? Thanks in advance! P.S.: I know of wireshell, but this doesn't seem to have any documentation on my use case or similar functionality as wp-cli (e. g. [wp core install](https://developer.wordpress.org/cli/commands/core/install/), [wp db create](https://developer.wordpress.org/cli/commands/core/install/)).
    1 point
  9. Just want to announce that I've uploaded a first public beta to the ProFields board. So all owners of ProFields may give this module a try:
    1 point
  10. Yeah, some of them are so complicated they'd be better as standalone apps/profiles definitely. I can't imagine the more complex ones really being easy to install as modules as they'd be made up of half a dozen themselves ?
    1 point
  11. I hear you. The PM system idea comes from me using and loving most of the features of ActiveCollab but becoming annoyed that at times it doesn't do quite what I want it to and could just do with a custom field here and there. Plus they really ramped up the price of self-hosted from the original £99 about 10 years ago as they're trying to push everyone to the cloud, and I suspect whilst everyone seems to be heading to the cloud there are still a lot of companies who would like more control over their data. But that is a big project. The event/accomodation booking on the other hand... I pretty much had the bulk of this done several years ago for something that never came to fruition, but I didn't think there would be enough interest to be honest! I may dig out the old video I put together for it later on so you can all see where I was going with it - it had all the booking/customer administration done and would probably just need some tweaks here and there for the new PW admin theme as well as input from other interested parties on any features I may have missed. Thanks for reminding me about Omnipay - I keep forgetting that exists. I tend to lean towards Stripe by default as there are no PCI compliance issues if you use the JS popup to pay and it looks like they allow you to use that in Omnipay so would be worth looking into in order to support other payment methods more easily.
    1 point
  12. An event / accommodation booking system with payment (i.e. Omnipay) would be awesome and a real benefit to the PW ecosystem since they often have a more bespoke implementation. The Helpdesk and PM is so overly crowded and feels more SaaS to me.
    1 point
  13. @simonGG - I'd also recommend using @nbcommunication's fork (linked above) which handles attachments in a more PW way.
    1 point
  14. Good pick-up @wbmnfktr! /site/init.php is different to /site/templates/_init.php I guess the custom of using ready.php is that by that time, PW knows about the current page which in this case, is referenced in the hook.
    1 point
  15. The addAttachment method requires a file path on the disk, not an url. Try $m->addAttachment ( $page->email_main_img->filename ); See also https://processwire.com/api/ref/pageimage/filename/
    1 point
  16. There have been, and still are, requests for adding sqlite to PW. Perhaps that would give you something to work on commercially. Besides sqlite database, how much would it roughly cost to add xml database to PW ?
    1 point
  17. As per the last comment in the linked thread, my approach is to use a Pages::saveReady hook save all text content on each page to a hidden "index" field in the template. Then there is just a single field to search and pull excerpts from. I have a module that I'll get around to releasing one of these days, but the basic idea is that in the saveReady hook you loop over all fields in the page, get the text content from the field depending on field type (e.g. strip markup from CKEditor fields, get descriptions from an images field, loop over subfields in a Repeater/PageTable, etc) and save that to the index field.
    1 point
  18. Sure, init.php runs before ready.php as well, but thanks for the link, which explains this more precisely:
    1 point
  19. Be careful here @Autofahrn and @psy. @VeiJari is talking about init.php and not _init.php. init.php ready.php finished.php Just to keep this in mind. https://processwire.com/blog/posts/processwire-2.6.7-core-updates-and-more/
    1 point
  20. Perhaps this will help? Oh, and welcome to the forum! ?
    1 point
  21. The solution with module suggested by Adrian works perfectly, no more headaches. My problem was that the field dog-father and dog mother are fields Page Autocomplete, but with query selector, for dog_mother -> show only pages of template where dog_sex = female and for dog_father ->show only pages of template where dog_sex = male. So when I create new page via Autocomplete by hitting enter, it does not populate created page in field because, created page have no dog_sex setting saved, only title when doing it this way. Now I create all page in modal, dog_sex is required field so, problem solved.
    1 point
  22. Great points @wbmnfktr! Thanks for pointing me to ploi.io @Mikie - looks like a good alternative to runcloud ? I'm using my own VPS's at reliable hosting companies in AUT/DE as for the reasons @wbmnfktr mentioned. Personally I don't do any installations on 3rd party hosting providers any more. For me it was always a pain at some point. For example one hoster just didn't have SSH access and there was no option to transfer the whole site at once. Transferring the whole site via FTP would have taken hours... that's really not worth the saving of 5€/month compared to having all on my VPSs and full control over everything and being efficient and fast. I've never had problems with my clients paying 5-10€/month for hosting on my server, when I tell them that setting up the website on their servers costs extra money and is a lot less efficient and more expensive in everyday operation. And that's not a lie! But it depends on your business... If you only do simple websites with no extra needs and maybe even no updates for several years, then it might be easier and better to choose a standard hosting provider that does everything for you (including invoicing, which can be tedious). 5-10€/month is for sure not worth doing everything on your own if you don't need any advanced features (like ssh, git support, etc).
    1 point
  23. Microsoft Edge arrived in its Chromium-flavour version. For those who want to give it a try already. Right now you can download the DEV (weekly updates) and CANARY (daily updates) versions. https://www.microsoftedgeinsider.com/en-us/download/ Windows 10 needed. Windows 8.1/8/7 and macOS will follow soon.
    1 point
  24. Hi @sambadave, if the available solutions do not fit, you can modify the markup of any field as you want quite easily. One option is the Inputfield::render hook. First, start with a general hook to check if everything works: // /site/ready.php $wire->addHookAfter("Inputfield::render", function(HookEvent $event) { bd('fired'); }); You should get lots of dumps when opening your page (using TracyDebugger of course): Make it conditional to only fire for your field and change the class to InputfieldSelect to be more specific: $wire->addHookAfter("InputfieldSelect(name=availability)::render", function(HookEvent $event) { bd('fired'); }); It will fire only once: The HTML is in the "return" property of the $event: $wire->addHookAfter("InputfieldSelect(name=availability)::render", function(HookEvent $event) { bdb($event->return); }); You can then modify this html like this: $wire->addHookAfter("InputfieldSelect(name=availability)::render", function(HookEvent $event) { $html = $event->return; $html = str_replace("value='1'", "value='1' style='background: red; color: white;'", $html); $html = str_replace("value='2'", "value='2' style='background: blue; color: white;'", $html); $html = str_replace("value='3'", "value='3' style='background: green; color: white;'", $html); $event->return = $html; }); For more complex modifications it's better to hook the field before it get's rendered (search the forum via google for ProcessPageEdit::buildForm). You can also see https://github.com/BernhardBaumrock/TemplatePreviewImages for a simple example of modifying inputfields and applying an additional library.
    1 point
  25. Hi @Pete Forums are looking much better. I personally find them easier to use with the updated theme. FYI I notice the Developers Map is currently broken. https://directory.processwire.com/map/
    1 point
  26. @thomasaull It is a 1&1 issue. The article here describes it. ? https://www.phpgangsta.de/php-und-http-auth-bei-1und1-webhosting
    1 point
  27. @pmichaelis I'm gonna ask anyway: Why? ? Seems like a weird server config, but I could add this to the variables the module checks by default.
    1 point
  28. Hi Robin, Just trying this out and it works very nicely. Could you be persuaded to add something akin to your password generator into this for generating and pasting random access tokens? Also, is the Message field put through any text formatters? How about allowing it to be put through something like Markdown?
    1 point
  29. ok i'll be able to work on it starting next week, and will check back in here once i have something to report... Doh! just checked the modules directory and Ryan already made the switch... thx @ryan! Will proceed with testing now for ensuring we don't break things with the refactored code, might take a week or so on this...
    1 point
  30. Could that "Forums" text in breadcrumb be a link to forum frontpage?
    1 point
  31. Hey @Pete - thanks for the updates. Once outstanding thing is the link color on this page: https://processwire.com/talk/discover/unread/ being black instead of pink.
    1 point
  32. Thanks for this and all your work on the other issues. I think the current sate is just good enough!
    1 point
  33. Thank you for pointing this out. Very new to all this. Will be more cautious and take the time to, as much as I can, read most of the thread before posting. No bad intentions here. I guess I am still under shock for what happened with WP and Gutenberg, saw the title and felt it would be good to voice my concern before things get going. Thank you indeed.
    1 point
  34. Excellent. Do you mean a native/ProcessWire core way to output JSON data from the databse through the use of a then native REST api that is called with vanilla JS? That is, as far as I can see from being about 48h into ProcessWire, the only thing I could not find. But again I found modules that do this, so perhaps leave it in modules? it would somehow be very cool though to have core team approved modules that work with the Basic site profile so devs new to this can build from there and learn. Is there a core dev team or is Ryan the one and only being able to commit to ProcessWire? I agree though in a certain way. There are devs that work per client requirements and then there are web designers that just want a page-builder to be able to sell websites/themes that then clients might buy without having to hire a dev while also wanting to use ProcessWire. I guess for the later such a page-builder would come in very handy. I am raised with the "build it yourself" frame of mind, sure not re-inventing the wheel, though the satisfaction of knowing what source will be produced is very important to me, especially knowing where the source code comes from, meaning what in the end is responsible for each line of code that the browser gets to render. But.. given a module would be made that enables devs to output clean code without having to load external libs into the frontend while also being an advantage to devs in the sense that snippets/blocks of code/content sections could be easily dropped and dragged in the backend, well I would at least give it a shot, given it is clean and does not interfere with ProcessWire, meaning if you remove such a module the database and source code produce the same result in the frontend. Quality content is kind. There is tons of well designed websites with plain bad content. I don't see Gutenberg being user friendly or a real thing to look at as a reference for what could be useful for ProcessWire in terms of SPA editing. My experience with Gutenberg was that is made me feel that the entire dashboard has become very brittle on a psychological level, meaning, you click, it shows up, but if it really is saved and will work is a different matter. Often the preview would not render anything, blank page. At least for me, opening and saving things one after another makes me feel much more in control, knowing what why when and where code will be in the frontend. But this is just personal preference. I guess I like things clean, working and working well. Bottom line, I do not find the idea bad per se, I just think something like this requires a lot of thought and careful use case consideration before any code is written, i.e. who would benefit most from such a SPA editing module and what would be the implications for ProcessWire. I say let's first get that JS api going if I understood you correctly that that is/was on the roadmap.
    1 point
  35. Nobody's talking about bringing content builder stuff to the core. I guess only Ryan could)) But the request for content building is high. Content is king. And RepeaterMatrix + Hanna codes are not as user friendly as Gutenberg seem to be. SPA editing is way more pleasant than opening and saving things one after another and adding images only after 1st save. PageTable Extended showed a way true block editing could be done in PW. Frontend editing is another step that could revolutionize content editing, but I never read about any good implementation. RepeaterMatrix is cool and could be even better if it would be PageTableMatrix with a similar Inputfield))) I think we can and should find a way to solve this need in true ProcessWire way. And we have to look at competition. Gutenberg might be hard and messy for developers, but it is desirable for end users. Let's make good for both using our strong points. P.S. js page api was on the roadmap. Might be a good fit here once it's done.
    1 point
  36. When React dies, so does WordPress. They have tightly coupled WP to Reach, the learning curve to WP development has become a lot steeper than it was before. While JavaScript and browsers are evolving in a direction where therel will be less and less need for complex frameworks, see: https://codequs.com/p/r1Jzty4S4/do-we-still-need-javascript-frameworks quote: "That said, much of what frameworks do will probably become easier to do with smaller libraries and/or native code as time goes on. Take my application as an example. At the same time, if the large frameworks and libraries remain versatile they may morph, adapt, and stick around. If not, they may end up like jQuery — a tool of the past for the most part." I would like to add that jQuery is not a thing of the past but still going strong ?
    1 point
  37. Longtime WP user. Came here to escape the madness that is Gutenberg. Please, for love of ProcessWire, do not include any such editor crap inside core. People can do so via modules or even admin themes but keep PW clean, neat, tight, free and fresh from such nonsense. Just learned about ProcessWire a couple days ago at a JS workshop/conference. Reading the docs, doing first examples and totally in love with it all. Keep it that way please. Regarding Gutenberg. Not only do you need to know React deeply, no also JS and a lot of it and deeply also, then you get to work with a "the WP way" version of React to build things. With Gutenberg WP has set the bar to entry into the WP world way above average, all the hobby coders that could easily make a WP site given a month of learning are now facing a very steep and intense learning curve. This will surly show going forward. This is what got WP off the ground in the first place. Ease of use and also ease of getting a site done. This has changed. Kids these days want to see results, fast. Sure if you don't care about PageSpeed or WebPageTest, just need a page-builder, plaster external libs all over the source, go ahead, if that is your game, and if that is what you unknowing client pays for, the sure, yes, use WP and Gutenberg exactly for this kind of crap. But if you really do care about all these things and want to make a good site that performs well where the client can have multiple custom blocks showing in the frontend, then you are going to have to invest a lot of time learning JS and React and "the WP way of React". Not something I see any entry level coder feeling up to. For example Just go ahead and make a responsive image block, and I don't mean just the img tag but something more like this. https://dev.opera.com/articles/responsive-images/ Asked around many frequented channels, senior and seasoned devs could not come up with something that produces usable source code. One guy had a solution, asked him if he could show the code "sorry, no, we have a team of devs working on that in our agency and cannot show it publicly". Go figure. A whole team of devs at an agency for a responsive image block to work in WP. Well done Matt and super smooth more there Mark, slipping React into WP that way. A good colleague that has been using WP all his life and knows PHP inside out tells me "I am going to stay away from Gutenberg for as long as I can". By your means, feel free and make a module, load the editor of your choice, give the client what you think they need or want, but do all this strictly kept away from the beautiful, clean and nice source that is ProcessWire. Given the WP mess I am sure there will be more and more people going to use ProcessWire in the future. I plan to speak publicly about ProcessWire at a conf as well as hold workshops, I am that much convinced about it. I would not even go this way if I would have discovered any dependencies on external libs or any such page-builder crap that now WP has built in. And now back to the docs and examples. It is such a pleasure. ProcessWire.
    1 point
  38. Without going into too much detail regarding the previous discussion here, I've just heard of https://gutenbergcloud.org/ for the first time, and I've got to say that it seems promising. The basic idea is to provide a common service for installing all sorts of blocks – and only the blocks you actually need. (Currently the situation is roughly that some blocks are shipped as one-block plugins, while others ship as massive collections of blocks, neither of which are really optimal.) Also took a quick dive into Gutenberg for Drupal (which Gutenberg Cloud promotes), and they've done a smashing job there ? I'm definitely interested in looking into setting up a Gutenberg Fieldtype, or perhaps a Process module – or something similar. Though once again my desk is kind of full, so who knows. -- Although I did say that I wouldn't go into the earlier discussion, just a quick comment on that: As a tool Gutenberg has it's flaws, and it's definitely not a tool that would/could/should somehow replace what ProcessWire does. I don't think that anyone has been suggesting that here either. Gutenberg is a block builder, and admittedly one still in a relatively early state – but even at this stage it looks promising. There really aren't any serious contenders, particularly fully free and open source. Right now there's also a lot of momentum behind the project – not to mention financial backing from Automattic – which means that as a tool it will undoubtedly improve over time, and current issues will eventually get ironed out. Whether going with Gutenberg is a good thing for WordPress or not is a debate I don't want to get into. Personally I don't know anyone seriously developing sites with WordPress and not using either one of the existing block / page builder solutions, or some sort of ACF based approach. WordPress alone is not the point – the plugins are. Since block editors are probably the most popular way of building WordPress sites, in my opinion having one built into the core is a logical next step. But that's just my opinion. And again, it has little to do with ProcessWire ?
    1 point
  39. Hi @adrian, A lot of the code is much the same, but tidied up with the the coding style guide implemented, so I'm not surprised the diff doesn't reveal much! The readme is pretty thorough and covers a lot, but here's the gist: addData() - add X-Mailgun-Variables - https://documentation.mailgun.com/en/latest/user_manual.html#attaching-data-to-messages - to be honest don't know what use cases there are for it but it's in the API and was easy to implement addTags() - add multiple tags as an array getHttpCode() - to get the response code from either send() or validateEmail() * Most methods now chainable (see the Advanced Example in the readme) Tracking only used if bodyHTML() is set (As this only works in HTML email) cc() and bcc() only used when batchMode is off - this seems to me to be the correct implementation WireMail::htmlToText() used for generating the text version if only HTML passed (as in WireMail now) The ASCII conversion for tags now uses $this->sanitizer->nameFilter($tag, [" "], "", false, 128); WireMail::replyTo() implemented - doesn't seem to have been before removed addAttachment(), now uses WireMail::attachment() - which adds the ability to set the filename Unixtime is now passed to setDeliveryTime() A bunch of other small tweaks like using $sanitizer->email() in validateEmail() * I'd wanted to use WireHttp for the requests, but it doesn't allow custom cURL options. I have done a pull request for this, but I don't think I'll be changing the module's cURL request implementation now anyway. Cheers, Chris
    1 point
  40. Hey @openmedi. Welcome to the support forum! I'd start by looking into the WireShell "new" command, which is documented. Haven't used this myself, but it seems like it should do exactly what you need.
    1 point
×
×
  • Create New...