Jump to content

Search the Community

Showing results for tags 'FormBuilder'.

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Welcome to ProcessWire
    • News & Announcements
    • Showcase
    • Wishlist & Roadmap
  • Community Support
    • Getting Started
    • Tutorials
    • FAQs
    • General Support
    • API & Templates
    • Modules/Plugins
    • Themes and Profiles
    • Multi-Language Support
    • Security
    • Jobs
  • Off Topic
    • Pub
    • Dev Talk

Product Groups

  • Form Builder
  • ProFields
  • ProCache
  • ProMailer
  • Login Register Pro
  • ProDrafts
  • ListerPro
  • ProDevTools
  • Likes
  • Custom Development

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


AIM


MSN


Website URL


ICQ


Yahoo


Jabber


Skype


Location


Interests

  1. I had situations come up that just seemed like AJAX was the right way to handle interactions with the ProcessWire server - pages with an element like a button or link that should cause an action to occur but shouldn't require a form or actually following a link - it should just take the action and only update the toggle (a checkbox in this case) when the interaction is completed. Another use case is with a large page on which there are multiple possible interactions. When the page is heavy enough that redrawing results in a less than optimal user experience then it's nice to be able to submit a form without having to redraw the page in order to update the relevant parts. So with that preamble, here's what I put together. I was going to try to clean it up a bit but that has prevented me from posting this so I figured it's better to post it and clean it up if there is any interest. You'll see references to the namespace whale - the name of our project - that would ultimately be removed. There are two major components - the PHP side and the client-side. On the PHP side there are two functional areas: 1. "wrapping" an entity to be inserted into the HTML on a page Wrapping (the function 'makeContainer()' puts a predefined wrapper around one of three types of objects: FormBuilderForm, InputfieldForm, or Template). The wrapper provides context and attaches classes that allows the client JavaScript code to find the wrapper and figure out what to do with it. // // define a function that makes a "form" of a single button. // function makeButton ($label) { // get the form $form = wire('modules')->get("InputfieldForm"); $form->attr('action', './'); $form->attr('method', 'post'); $submit = wire('modules')->get("InputfieldSubmit"); $submit->attr('id+name', 'submit'); $submit->attr('value', $label); $form->add($submit); return $form; } // wrapper function to set label on submit button function requestUserDeleteList() { return makeButton('Do it!'); } // // makeContainer wraps the rendered InputfieldForm in HTML so the client JavaScript can recognize it and handle // AJAX interactions with the server. // It returns the InputfieldForm object and the HTML to be inserted into the page. Note that makeContainer // is in a different namespace so it requires the function name must be qualified with the \ProcessWire prefix. // list ($form, $deleteUsersHTML) = ajax\Request::makeContainer('do-something', '\ProcessWire\requestUserDeleteList'); 2. helping with the processing of an AJAX request that is submitted to the page. Helping with the AJAX request - the code is invoked on page load and determines where there is a valid AJAX request from something it wrapped. It also allows messages to be returned, classes to be added or removed from specific elements, redirects to be executed, or even wholesale replacement of DOM elements (with plenty of caveats). It will even update a submit key so it is possible for the client to execute a single transaction multiple times. // get a new request object for the AJAX transaction $request = new ajax\Request(); // if it isn't formatted correctly handle the error if (!$request->isValidCall()) { return $request->echoError(); } // get the data and function-specific contents (Whale Ajax Context) $data = $request->data(); $wac = wireDecodeJSON($data['wac']); // if ($request->id('wants-newsletter')) { if (!ajax\Request::hasCorrectProperties($data, ['wac', 'value'])) { return $request->echoError(__('invalid call')); } // implement function here } else if ($request->id('another-function')) { // implement function here } // it didn't match any of the AJAX IDs implemented return $request->echoError('not implemented'); The client code requires jQuery and is packaged as three separate functions because both the form and template processing share a common core set of functions. My original intent was to only load the form or non-form code as needed but they're small enough that it really doesn't matter. See attachments for the Request class and the client code. There are many helper functions. Here is a kind of an unfocused extract that illustrates using the code with more context (from an internal sandbox page): <?php namespace ProcessWire; using whale\ajax; // include server-side code for making forms and processing them require_once './utility/ajaxform.inc'; // custom version of ProcessWire/wire/core/WireFileTools.php render() that returns the // template object, not the rendered HTML require_once './utility/get-file-template.inc'; // START AJAX submitted form processing - decodes the request and stores results in $aaform. $aaform = new ajax\Request(); // // this page handles multiple ajax calls so I check to see if it is valid once and then check IDs. // It's also possible to use $aaform->isValidCall('get-user-delete-list') to check specifically // for a specific AJAX ID. The ID is the name provided to Request::makeContainer() when the object // is wrapped. It's also possible to make calls to $aaform->id('get-user-delete-list') to check // for a specific ID. // // to create the forms/input elements that are submitted via AJAX start with: // Request::makeContainer('unique-name-on-page', object) // unique-name-on-page will become the ID of the element that wraps your object. // object - one of ProcessWire\InputfieldForm, \FormBuilderForm, ProcessWire\Template. // if ($aaform->isValidCall()) { if ($aaform->id() === 'get-user-delete-list') { $form = requestUserDeleteList(); // process using the form. the Request object will check to make sure it's the right type. if (!$aaform->process($form)) { return $aaform->echoError(); } // build new form with usernames for selections to delete. the function getUsersToDelete() // returns a user count and a function that will make the form that includes the users in // a list of checkboxes. list($usercount, $formmaker) = getUsersToDelete(); // this returns a replacement to part of the existing DOM. There are limitations but it // handles adding a form or replacing an existing form. if ($usercount === 0) { $replacement = '<div id="ajax-place">No users to delete</div>'; } else { // we pass the $formmaker function to makeContainer(). It returns the form and the // rendered wrapper and form. list($xform, $xhtml) = ajax\Request::makeContainer('do-delete', $formmaker); $replacement = '<div id="ajax-place">' . $xhtml . '</div>'; } // this makes sure the return is formatted so the client can handle it correctly. in // this case a replacement in the DOM is being returned. The first argument is the // selector, the second is the HTML to replace the selected element with. return $aaform->echoReplacement('#ajax-place', $replacement); } else if ($aaform->id() === 'do-delete') { list($usercount, $formmaker) = getUsersToDelete(); // process using the form returned by $formmaker. this will check to make sure it's // the right type of form. This abstracts FormBuilder forms and InputfieldForms. if (!$aaform->process($formmaker())) { return $aaform->echoError(); } // a bunch of logic where the checked users are deleted $deleted = []; $failed = []; $data = $aaform->data(); foreach($data as $name => $value) { if ($name === $value) { $user = wire('users')->get("name=$name"); $email = $user->email; // delete the user and try to get it again to see if the delete worked wire('users')->delete($user); $u = wire('users')->get("name=$name"); if (!count($u)) { $deleted[] = $email . " ($name)"; } else { $failed[] = $email . " ($name)"; } } } $deleted_users = $failed_deletions = ''; if ($deleted) { $deleted_users = 'deleted:<br/>' . join($deleted, '<br/>') . '<br/>'; } if ($failed) { $failed_deletions = 'failed to delete:<br/>' . join($failed, '<br/>') . '<br/>'; } $replacement = '<div id="ajax-place">' . $deleted_users . $failed_deletions . '</div>'; return $aaform->echoReplacement('#ajax-place', $replacement); } else if ($aaform->id() === 'contact') { // here a FormBuilderForm is being loaded if (!$aaform->process($forms->load('contact'))) { return $aaform->echoError(); } // this sends a notice back. the client will place it in a predefined notice area. // Request::makeContainer() will create an area for notices (or you can supply one). // It is also possible to return errors; notices and errors get different classes. $msg = ajax\Request::makeNotice('bruce says hi'); return $aaform->echoSuccess($msg); } else { // it was a valid form but it doesn't match any ID that this page knows about. return $aaform->echoError('what is this?'); } } // normal processing to render the initial page follows as it was not a valid AJAX post // that is handled by Request(). That's a lot of code, so I won't post anymore. If people have interest I'm happy to explain or provide other bits of code, like the extracted get-file-template.inc function. Wrapping a template is similar to wrapping a form except that only certain HTML elements are tracked and each are sent to the server when they are clicked on (technically it varies). It handles radio buttons, checkboxes, links, and buttons (radios and checkboxes on "change" and links and buttons on "click"). So when a checkbox is checked an AJAX call will be made so it can be acted upon by the server. @microcipcip, @ryan, @valan (sorry to any if this isn't interesting to you - I did a quick scan of what looked like semi-related AJAX posts). ajaxform.inc ajaxclient.js
  2. Hi there! I just bought the formbuilder module (which is really great, thanks Ryan!), I was wondering if it was possible to access in any template directly the entries without using the page creation option. In other words is it possible to have something like this: $forms->formtitle->fieldtitle I searched for it but I have to say I'm kind of feeling that there is missing a little technical introduction in the readmefile provied at the download. Thanks for the attention, and again, thanks Ryan for having build this, it's really useful for us and our clients!
  3. Hello, I am very happy user of Processwire, and I'm thinking to build a personal project. This project will have a lots of forms, so I was thinking to use Formbuilder to save time and also to support Ryan for his awesome work on Processwire. Its a like an team management system, where I can store information about users, teams, what team the belong, inventory, journal etc. If someone who has used Formbuilder can help me with this questions that would be great. Can I create custom listings of the form submissions? Can I create pages with this listings Build custom reports Manage permissions access of the forms, listing and reports Thank you
  4. Hi Guys, Here are two issues that took my quite the amount of effort to fix so here im sharing the answers with you. 1. Non-admin user can’t edit profile information using Fredi. I installed Fredi and I sort of got it to work since when logged into Admin i'm able to edit my profile information, when logged in as anyone else however I don't get the "Edit" button. Also showing just certain specified fields doesn't work. When i call Fredi using this syntax and I'm loggedin as Admin it shows me all the editable fields of the user profile, not just "zzp_profiel_naam". $username = $user->name; $another_page = $pages->find("parent=user, name={$username}")->first; echo $fredi->render("zzp_profiel_naam", $another_page); Also I was wondering if it is possible to embed the edit-fields Fredi shows me in a lightbox directly on a page without the lightbox. This would make handeling the updates a lot easier also since it won't have to open the lightbox again on submitting changes, and you won't have to close it again after doing so. SOLVED Instead in using FREDI I used to backend modal to do this, include it like this: <?php $page->setOutputFormatting(true); ?> <iframe src="/cms/profile/?modal=1" style="width:calc(100% - 300px); float:left; border: 2px solid #ccc; padding:0px 0px 0px 0px;" onload="resizeIframe(this)"> </iframe> I used this javascript to change the iframe height to the height of the dynamic content, you could maybe add a onchange listener to resize it every time the height of the content changes. <script language="javascript" type="text/javascript"> function resizeIframe(obj) { obj.style.height = obj.contentWindow.document.body.scrollHeight + 'px'; } </script> A problem arose when trying to update single image fields, the modal added a second and left the first as it was. To remove the first when uploading a new one to a single image field add this to /site/ready.php // Make sure image upload into single image field deletes old image first $p = $page->process; $t = $page->template->name; if ("ProcessProfile" == $p && "admin" == $t) { $page->addHookBefore('InputfieldImage::fileAdded', function($event) { $u = wire('user'); $i = $u->place_your_image_field_name_here; while ($i->count() > 1) { $i->shift(); } }); } SOLVED Click here for the answer: https://processwire.com/talk/topic/10884-text-area-paragraphs-when-creating-a-page-from-a-form-submission/ 2. Line Breaks from Form Builder textarea not being transferred to the Rich Text Editor on the page it is saved to. What I need is for each textarea inside any form on the site to maintain it's line breaks like submitted by the user when transferred from entries to a page after being checked. The result in the form entries is what is is supposed to be, maintaining the line breaks. When transferred to a page however the breaks don't get transferred end I end up with one large block of non-breaking text. This is what me and some others have concocted to far. The upper part is working and sets a test message in the logs. The bottom one however is not. If I change the method to "saveForm" instead of "savePage" it does give me an error since afterwords I try to call objects that don't exist within the "saveForm" method, so I would assume it's getting called. // This is getting called and sets a test message in the Logs $forms->addHookAfter('FormBuilderProcessor::saveForm', function($event) { $processor = $event->object; $event->log->save('test', 'data=' . print_r($data, true)); $event->log->save('test', 'savePageFields=' . print_r($processor->savePageFields, true)); }); // This is not setting a log file, not even when I transfer the Form entry to a page $forms->addHookBefore('FormBuilderProcessor::savePage', function($event) { $processor = $event->object; $data = $event->arguments(0); foreach($processor->savePageFields as $fieldID => $name) { if(empty($data[$name])) continue; $field = $event->fields->get($fieldID); if(!$field || !$field instanceof FieldtypeTextarea) continue; $data[$name] = "<p>". str_replace("\n\n", "</p><p>", $data[$name]) . "</p>"; $data[$name] = str_replace("\n", "<br />", $data[$name]); $event->log->save('test', 'data=' . print_r($data, true)); $event->log->save('test', 'savePageFields=' . print_r($processor->savePageFields, true)); } $event->arguments(0, $data); }); If you can, please please please! Help me out, im really desperate and have been trying to fix these two problems for ages now Thanks in advance, Bram
  5. Hey Guys! I ran into some really strange behavior when trying to save selected Selectfieldtype values from a form to a select field in a page. I have three different dropdowns in this page, all with different values and they randomly get saved en sometimes they don't. This is my setup: Form Page: Dropdown a: Dropdown a: - - V - - - V - Dropdown b: Dropdown b: - - V - - - V - Dropdown c: Dropdown c: - -V - - - V - I have no idea what is causing this since it happens completely randomly, does anybody have any ideas? Like, would it make more sense to only use a text field on the page side to recieve the value? and if so, why? Thanks in advance Gr, Bram PS: In the screenshot you can see the three filters that pick up the dropdown values and show the entries that are equal to the filter. And you can see the dropped values in the submissions.
  6. Hey all, I'm brand new to processwire and have already fallen in love with it. Currently I'm building my first website with it and I need a way to style the form builder generated forms with CSS. I know it's possible to style them with the jQuery UI themeroller, but I need more direct control. I've looked through all the CSS files I thought could be related with the form, but I can't find how to add my custom styles via CSS. (I can't access the markup directly to do a hackathon because the forms are embedded via iframe.) Thanks in advance, Nick
  7. I'm having a little bit of trouble since swapping from PC (running WAMP) to MAC (running MAMP). I managed to get my site copied across to my MAC local server and everything is running fine... but I've noticed that when I submit a form (originally created using the very awesome formbuilder) that the email doesn't send and I don't get any confirmation email either. Does anyone know where I might be going wrong or where a good starting point would be? I just double checked the form on my windows machine (running WAMP) where both the email and confirmation email sent with no hiccups. Any tips would be appreciated. Thanks
  8. Hello Ryan, I am planning to get a license for form builder module and will be using the feature to create a page, from form submissions. The form needs to calculate and set values to input fields from user input in previous input fields and register these results. What is the best way to accomplish this. Where is the best place for the logic to do to be initiated. A form id based template or a seperate post event based controller script? I have accomplished this on frontend forms with jquery, but in this case since I am not a php pro I would appreciate your pointing me in the right direction and also to use PW's api the right way. Thanks for your time. Best, Gaurav
  9. Hello, I have a frontend contact form with datepicker and need to have the german localization for it. I read about localization of datepicker on the jQuery Ui API page. How can I implement this in PW? I'm using FormBuilder module My form is loading these assets: InputfieldDatetime.js JqueryCore.js JqueryUI.js I rolled a custom UI theme and amended the js to have German language for datepicker. Now when I load that js file on top of the above mentioned, nothing changes. So I guess, the standard PW datepicker options do net get overridden by my custom theme js. In this thread apeisa says How would I go about it? Thank you gerhard PS: and sorry for doubleposting. I thought I explain my situation a bit more in this new thread.
  10. hi, is it possible to have more than one form on one page with the formbuilder module? I've two forms and after submiting one form, the other shows an "Invalid form submission" message. same behaviour on both forms. both are integrated using OPTION C. PW 2.3 formbuilder 0.2.2 purchased thanks!
  11. Here is a recent site done in processwire: http://licoriceensemble.com/ modules used include formbuilder procache cropimage version control for text fields after save actions based on a template by the great team at Elemis.
×
×
  • Create New...