Leaderboard
Popular Content
Showing content with the highest reputation on 07/19/2018 in all areas
-
I don't know if this is the right place, it's not really a tutorial, just a tip based on notes I wrote myself in a recent project to get it straight in my own head. I thought it might be useful for others in a similar situation. Scenario: Create a search function that will search for keywords "foo" and "bar" in multiple fields, but the keywords do not have to be adjacent, in order, or even all in the same field. For eample, the selector must match if "foo" is in "field_a" and "bar" is in "field_b" -- so long as both keywords are present somewhere, the page match is valid. It is possible to just split the terms and do multiple queries on each field separately and then combine the results into a single PageArray for pagination (I believe there is a module that helps with this). However, I wanted to see if it was possible to do a basic version with a single query. Not The Solution: The following selector does not work when keywords appear separately in different fields (operator '~=' - contains all the words): $selector = "title|field_a|field_b~=foo bar"; What the selector is saying: FIND BOTH "foo" AND "bar" IN title OR FIND BOTH "foo" AND "bar" IN field_a OR FIND BOTH "foo" AND "bar" IN field_b In this case, both "foo" and "bar" have to be in the same field (but not adjacent or in order) to match. The Actual Solution What we need to use is "named selectors" to let us match each individual keyword separately while still using one selector. Using the same example as before: $selector = "selector1=(title|field_a|field_b~=foo), selector2=(title|field_a|field_b~=bar)"; What the selector is saying at its most basic level: FIND BOTH selector1 AND selector2 Or, to expand on this, it is saying: (FIND "foo" IN title OR field_a OR field_b) AND (FIND "bar" IN title OR field_a OR field_b) Crucially, "foo" and "bar" do not have to be in the same field to match. Practical Method In this example code, I am actually allowing the search for phrases (using "quoted text") as well as individual terms, so a person could enter... "foo bar" baz ... and it will keep "foo bar" together aa one term and "baz" as a separate term and match them as an exact phrase. // Keywords obtained from $input->get and cleaned (multiple spaces removed)/sanitized etc. $keywords = '"foo bar" baz'; // Split into individual search terms by space (preserve spaces in quoted text) $terms = str_getcsv($keywords, " "); // array("foo bar", "baz") // Build up named selectors $ns = ""; // named selectors string $i=1; // named selector count foreach ($terms as $term) { // operator '*=' - contains the exact word or phrase $ns .= ", ns{$i}=(title|field_a|field_b*=" . trim($term) . ")"; $i++; } //$ns = ", ns1=(title|field_a|field_b*=foo bar), ns2=(title|field_a|field_b*=baz)" // Construct the whole selector (modify/add other general selectors as needed) $selector = "template=my-template, limit=20, sort=-date" . $ns; // Find pages based on selector $results = $pages->find($selector); DISCLAIMER I haven't done any tests to see if this method is more efficient than running queries on each field separately and combining the results, I just wanted to see if it was possible!4 points
-
Yes, Designme has a custom permission that you can choose to add to a role.4 points
-
3 points
-
? looks so much better than my code. Thank you!2 points
-
@Soma Yeah this is my issue with Vue.JS - I use Vue.JS often for two way data-binding which is amazing to be able to easily update content and do visual changes to the site based on those updates. For example adding something to a basket. It's much easier with Vue than jQuery or JavaScript. My issue with Vue is exactly that. You can use it just on a component basis or you can use it to render your entire UI. To me it just doesn't make sense to use it to render an entire UI with a website. A web app sure, but a website it's often overkill and introduces that exact problem. You can introduce server side rendering of Vue with Nuxt but then it just seems like another layer of 'over complication'. I personally stopped using Vue for websites unless I absolutely needed two way binding. It just didn't make sense and the extra complication of implementing it such as having to convert everything from ProcessWire into a JSON feed. EDIT: Noticed this post still gets likes, so what's changed since then? AlpineJS. AlpineJS is a solution to this exact problem, worth a look for anyone wanting to do some cool UI stuff without including all of Vue features and overhead.2 points
-
@adrian Thanks for this module - it's working great; Just one question - Is there a way to prevent it displaying inside an iFrame-embedded formbuilder form? It displays the banner in both the containing page and in the formbuilder iFrame. Thanks, Ian.2 points
-
Sure, first pardon for my english ? 1. Create "wireRenderFile('name-of-file')" contain html code <a href='link to page x' target='iframe x'> link AND small size <iframe name="x"> depend on how much text result will be, give css class to a href so it is like any other in admin page button, iframe used here so when a href above clicked, the result will be displayed in iframe, not opening in new page. DO NOT use <form><button></button></form> in this page, it can't be executed. 2. Create new 'page x' and 'template x' file as a href link target in step 1 , processing code will be inside this template file, you can really flexible here by using get URL parameter in step 1, such ?id=something&status=something, example case is in invoice page, you can send different content email notification (unpaid vs paid) using one button. Hope this can help somebody else trying to send mail in admin page edit.2 points
-
All done. Simpler than I thought it would be in the end... $(document).on('wiretabclick', function(event, newTab, oldTab) { old_id = oldTab.attr('id'); new_id = newTab.attr('id'); if ((old_id !== new_id) && (new_id === 'Inputfield_mailing_actions')) { var changes = $(".InputfieldFormConfirm:not(.InputfieldFormSubmitted) .InputfieldStateChanged"); if(changes.length !== 0) { $('#Inputfield_save_btn').click(); } } }); The missing code was in the templates-admin/scripts/inputfields.js file at line 901.2 points
-
@netcarver - thanks for the compliment! Hope someone else finds this useful; for me this has become a life-saver and the clients/editors have given a lot of positive feedback, and less questions/problems/confusion... saves a ton on screen real estate when you absolutely have to have a fairly verbose field description, since you can hide most of it under the reveal...2 points
-
2 points
-
A few usability tweaks and tips for the CKEditor "Styles" dropdown, which is by default not that user-friendly: As you can see it's small and if you add custom items to it they may look awkward as they may inherit styles from their targets (a 3rem bottom margin in the screenshot above). These are relatively easy to fix but you have to load your custom CSS files to two places (eg. with AdminOnSteroids): PW admin and CKEditor. After loading the CSS/Js assets (see code below) the dropdown looks nicer and more usable: The screencap contains other features that you can achieve with the snippets below. Code CSS - CKEditor (contains demo styles too) CSS - admin JavaScript - CKEditor custom styles P.s. in case you wonder whether the half-margin, no-margin stuff and font-sizes from 12px to 48px were real-life examples - yes, client request ?1 point
-
The module has been lying around on GitHub for some time now, so I thought I'd give it its own forum topic so I can give it a module list entry. SymmetricEncryptedText Symmetric encryption for text based fields (supports multi language fields). Module page. Link to the GitHub repo. Description This module adds an encryption option to all text fields (and those derived from FieldtypeText). Field contents are encrypted using a symmetric key when a page is saved and decrypted when loaded from the database. The module by default uses sodium (if loaded) in PHP versions >= 7.2, otherwise it falls back to the bundled phpseclib. Multi-Language fields are supported too. WARNING! Setting a field to encrypted and saving values in those fields is a one-way road! Once encrypted, the contents cannot be unencrypted without writing a program to do so. Disabling the encryption option on a field after the fact gets you encrypted "garbage". Usage Download the zipped module through the green button at the top right of the GitHub repo or (once available there) from the official PW module repository Extract in its own directory under site/modules. In the backend, click "Modules" -> "Refresh", then install "Symmetric Encryption for Text Fields". Go to module settings. An appropriately sized, random key will be generated if this is your first use. Copy the supplied entry into site/config.php Add fields or configure already present fields. On the "Details" tab you can enable encryption for the field in question Edit a page with such a field, enter a value there, save and enjoy Existing, unencrypted values are left untouched until a new value is saved. That way, you can do a smooth upgrade to encryption, but you have to save all pre-populated pages to have their values encrypted in the database. Thus it is recommended to avoid adding encryption to already populated fields. Advanced Usage You can hook after SymmetricEncryptedText::loadKey to retrieve your key from somewhere else, e.g. a different server.1 point
-
Admin Page Tree Multiple Sorting ClassName: ProcessPageListMultipleSorting Extend the ordinary sort of children of a template in the admin page tree with multiple properties. For each template, you can define your own rule. Write each template (template-name) in a row, followed by a colon and then the additional field names for sorting. Example: All children of the template "blog" to be sorted in descending order according to the date of creation, then descending by modification date, and then by title. Type: blog: -created, -modified, title Installation Copy the files for this module to /site/modules/ProcessPageListMultipleSorting/ In admin: Modules > Check for new modules. Install Module "Admin Page Tree Multible Sorting". Alternative in ProcessWire 2.4+ Login to ProcessWire backend and go to Modules Click tab "New" and enter Module Class Name: "ProcessPageListMultipleSorting" Click "Download and Install" Compatibility I have currently tested the module only under PW 2.6+, but think that it works on older versions too. Maybe someone can give a feedback. Download PW-Repo: http://modules.processwire.com/modules/process-page-list-multiple-sorting/ GitHub: https://github.com/FlipZoomMedia/Processwire-ProcessPageListMultipleSorting I hope someone can use the module. Have fun and best regards, David1 point
-
Given your Page Tree structure, the following should be possible - assuming the Tasks have a common task_template with the field assigned_to_user: $matching_tasks = Spages->find("template=task_template, assigned_to_user=user1"); Smatching_projects = new PageArray(); foreach ($matching_tasks as $task) { $matching_projects->add($task->parent->parent->parent); };1 point
-
1 point
-
Slight bug report - if you have a template where the title is locked, it will cause the name field to clear and then you will get an error when trying to save the page about missing required value of name...1 point
-
Thank you @adrian for confirming. I have opened a issue. ? https://github.com/processwire/processwire-issues/issues/6421 point
-
1 point
-
First of all thank you @ryan for this great addition. I am a heavy user of the page search and use it more often than the page tree. ? I am not sure if this is a bug, but I think the new page search breaks the autocompletion of users: For example if I type in a username in the page search and select the suggested user, I will be redirected to the 404 page in the front-end with following url: http://example.com/processwire/access/users/username/ Instead the url should be something like this I think: http://example.com/processwire/access/users/edit/?id=123 Can anyone confirm this or is it maybe something on my side? I have noticed this on two different installations of PW 3.0.108. Regards, Andreas1 point
-
Yes, you can download the latest copy of Recurme from your original download link. I also send out an email to everyone that has purchased each update. Just in case you don't have it, I have PM'd you a copy of the latest version. Happy Coding.1 point
-
All nice and I know there's ways to get around it, but the Site has no content to crawl, just empty html. And if JS is not enabled you see this: "This is your fallback content in case JavaScript fails to load."1 point
-
Well I've tried to check for the template earlier and it worked, but it was rendering the menu if any page had that template. After you brought this, I thought to re-create the query and this way just add it in the get statement: // Check if the menu has an id of 1234 or has a title equal to my_menu_name // If no match for the ID but a match for the page title, then stil the menu would be rendered // If no condition match, the error page would not be shown on any user and the menu would simpy not render if($pages->get(1234)->title || $pages->get('template=menus, title=my_menu_name') !=''){ echo $footer_menu->render(1047, $options); } So we are adding an extra check to make sure that a similarity with another custom added page would be minimized. For sure it could happen, but there are already 3 criteria to match and I believe this would be enough. Thanks very much, @kongondo for the perfect module and the shared knowledge (as usual) ?1 point
-
Thank you for posting this. Sounds like an approach I could have taken. I chose to solve this a slightly different way though.1 point
-
1 point
-
FormBuilder does allow this by hooking into it. Check this blog post, it gives a hook reference for FormBuilder. http://processwire.com/blog/posts/formbuilder-v34/ Sounds to me that some hook work could help solve this too.1 point
-
Hello all, Can anyone point me in the right direction here. When editing the pages of a certain template, I have a tab (Fieldset Tab Open) into which I've added a runtime markup field which does state verification and, if all's good, adds an email send button to the page. I have a pages::saved() hook that takes care of the actual send should the button be clicked. This works fine, and is out on a production server, but it has a drawback; it requires the user to save the page before the information used to generate the send button is in sync with any changes the user has made. Even if I make the tab ajax load, this only works for the first set of changes the user makes, ie, when they switch to the tab for the first time. If they go back to one of the regular content tabs and make an additional change, the content of the send tab is now potentially stale and requires a re-save to freshen it. To help with this workflow, I'd like to make it so that the very act of clicking on the send tab activates a page save, if needed, ensuring the content of the send tab is always in sync with the stored data. State of page changes is tracked by JS already - so this must be possible. Whilst I'm sure I can patch my way to a solution, any help short-cutting that route would be appreciated. Many thanks in advance, Steve1 point
-
Thanks Macrura. I just tested and it looks like you can do this: // in site-settings.php // note the toolbar line and inlineMode line [ 'name' => 'ckeditor_test', 'label' => 'CK Editor Test', 'type' => 'InputfieldCKEditor', 'width' => '100', 'description' => 'Some Formatted Test', 'collapsed' => 0, 'value' => '', 'toolbar' => "Bold, Italic", 'inlineMode' => 1, ], Doing that will only show the Bold and Italic buttons in the CKeditor toolbar. It will also use inline mode. I'm not sure about the other stuff yet. I found those settings in wire/modules/Inputfield/InputfieldCKEditor/InputfieldCKEditor.module Hope that helps someone.1 point
-
Great module! I'm working on compatibility with AdminThemeBoss. I'd suggest adding the following css, because the default theme has a font-size on <a> inside the breadcrumb: .uk-breadcrumb >li { font-size: .875rem; } I personally would not even include the title because it's there twice with the page title… Also, I get an error when clicking on the arrow after the tree and then the root page:1 point
-
1 point
-
@Robin S 'requires' => 'ProcessWire>=3.0.83, AdminThemeUikit' doesn't work for you?1 point
-
Hmm, it's installing as expected here. The "requires" setting I've used looks like it conforms to the example given in the Module documentation. Any ideas why it might not be working in your case? I use the "AddNewChildFirst" option in AdminOnSteroids for blog/news items and the dropdowns work well with that. But I get your point and will look at implementing something that honours the "sort settings for children" on the parent page/template. And add a note to the readme about the 25 item limit. Yes, very likely will not be compatible with that module as AdminThemeBoss already modifies the breadcrumbs.1 point
-
yes you just need to make the permission the same name as the process page, and then use that permission to restrict; if you need examples i can explain it more, but essentially this is like the core permissions setup used by stuff like lister pro, where the permission for a process matches the process page name. I haven't looked at MarkupSEO for a while, instead i use my (yet unreleased) MarkupSiteMetaAdvanced module, which has like a gazillion seo settings, but much more since it covers basically everything related to meta data, including schema, all social media, DCMI, analytics, copyrights, location, as well as the ability to setup custom key value pairs or define a path to a json inputfields definition file (sort of like mini settings factory); preview:1 point
-
If I'n not wrong, @kongondo's VisualPageSelector module (commercial) should solve such an issue as it uses lister and its filters to select the related page: quote: "electable pages as per page field settings + Lister filters" see more: Or you might want to implement your own InputField which also uses ProcessWire's Lister and its user customizable page filter to select the page.1 point
-
It's happening on the fly. You are right, lot's of potential for destruction or accidents. I have double confirmation on deletes, but I keep turning it off because I am adding and removing a million fields every day. I will post an example in the next video. It's pretty un-intrusive, but adds the protection. Good catch ? (also, thanks for the help with showing empty fieldsets. As you can see in the video, it worked out quite nicely).1 point
-
Thank you for developing this useful module, now i can send email to certain user from admin easily, inspired from here : For those who need more explanation: Button is actually <a href> to template which will open new page (yes very ugly behaviour, read below) contain custom php code , not inside <form> action because <form> not allowed inside textarea. To prevent opening new page when click the button, make an <iframe> inside the template as a target button, that's it, beautifully execution like native form in admin page.1 point
-
1 point
-
@pwFoo, here is demonstration module you can use as a starting point. Just install the module and then view "My Page". MyModule.module <?php namespace ProcessWire; class MyModule extends WireData implements Module { /** * Module information */ public static function getModuleInfo() { return array( 'title' => "My Module", 'version' => 1, 'autoload' => true, ); } /** * Init */ public function init() { $t = $this->templates->get('my-template'); if(!$t) return; $t->filename = $this->config->paths->MyModule . 'my-template.php'; } /** * Install */ public function ___install() { $this->createTemplate('my-template', 'My Template'); $this->createPage('My Page', 'my-template'); } /** * Create template */ protected function createTemplate($template_name, $template_label) { if($this->templates->get($template_name)) { $this->warning("Template '$template_name' already exists."); return; } $fg = new Fieldgroup(); $fg->name = $template_name; $fg->add($this->fields->get('title')); $fg->save(); $t = new Template(); $t->name = $template_name; $t->label = $template_label; $t->fieldgroup = $fg; $t->compile = 0; $t->noPrependTemplateFile = true; $t->noAppendTemplateFile = true; $t->save(); $this->message("Created template '$template_name'."); } /** * Create page */ protected function createPage($page_title, $template_name) { $page_name = $this->sanitizer->pageName($page_title, true); if($this->pages->get("parent=/, name=$page_name")->id) { $this->warning("Page '$page_name' already exists."); return; } $p = new Page(); $p->template = $template_name; $p->parent = '/'; $p->name = $page_name; $p->title = $page_title; $p->save(); $this->message("Created page '$page_name'."); } } my-template.php <?php namespace ProcessWire; echo "This is the template file for my-template"; MyModule.zip1 point
-
Hi, thanks for this idea. Due to time pressure, I installed the »Sublime PW« profile and started to adapt it. This single page concept is build upon a Page Reference Field. In every page(= sections) you can throw your html structures.1 point
-
Finally I was able to release RockGrid I decided to release it as MIT, so everybody can contribute and maybe use it for other great additions to ProcessWire. I think it's a great way of listing data and I can think of several situations where it would make the admin UI a lot better than it is now with our existing tools. For example @adrian s batch child editor could maybe benefit from such a tool? I don't know. Let's see what happens... The module is still alpha and not perfect... But it was also a lot of work and can't provide anything better than that at the moment. If anybody here can do it better: Please feel free to take over ? Thanks everybody for all the feedback here in this thread! Special thanks to @MrSnoozles for showing me agGrid and making me replace datatables ?1 point
-
@neophron if you want a cool example of a onepage site with section as subpage, install and take a look at this profile :1 point
-
as far as I know the latest version of the inputfields all support UiKit theme; After upgrading all to the latest, you can post screenshots if you see any issues.1 point
-
Like a lot of the stuff coming from PHP's superglobals, using $_SERVER[HTTP_HOST] in that manner actually isn't safe because it comes from request headers, which can be manipulated by the user (a type of user input). $input->httpUrl() on the other hand would be safe, or for just the equivalent of $_SERVER[HTTP_HOST] use $config->httpHost instead (which is validated). If your server uses both http and https (meaning same page accessible via http OR https), then you'll want to point to the https one as your canonical version, like you are doing in your example above. Here's how you might rewrite your example above. If you aren't using URL segments or pagination, then it's also fine to replace $input->url() with $page->url() like you did. The primary difference between $input->url() and $page->url() is that the $input version represents the actual request (including page URL plus URL segments, page numbers, and optionally query string), rather than just the static URL of the $page that it loaded. <link rel="canonical" href="<?php echo "https://$config->httpHost" . $input->url(); ?>" />1 point
-
For those particular cases, your strategy seems fine, since the site/page/?forgot=1 and site/page/?register=1 are entirely different content from site/page/ without the query string (I'm presuming, as it looks like LoginRegister). Another way would be to block them with a meta robots tag in your document <head>, i.e. if($input->get('forgot') || $input->get('register')) { echo '<meta name="robots" content="noindex, nofollow">'; } Or, you could just deliver unique title tags, and omit the meta description tags, for those cases. But that would take a little more code, and these page variations presumably aren't useful to search engines anyway. So I think what you are doing, or the solution above, is a good way to go. For other cases, where the query string doesn't indicate entirely different content (such as a GET var that changes the sort of a list, or something like that), you'd probably want to use a canonical <link> tag. This will tell the search engine that the request can be considered the same as the one given in the href attribute. And the URL in the href attribute is the canonical, or main one. This will prevent the Google Search Console from flagging duplicate titles or meta descriptions on the query string variations of the page. <link rel='canonical' href='<?=$input->httpUrl()?>'> Btw, the $input->httpUrl() includes URL segments and pagination numbers (when applicable) so is more likely to be preferable to $page->httpUrl() when it comes to canonical link tags.1 point
-
Hey, sorry. So I've looked into this for you and I was completely wrong. To explain - hooks are functions that run before or after another function such as Page::save(). So return false; will only return false on the extended function and not the save() function itself so the save will still happen. Actually the solution is much, much simpler. In your ready.php all you need is <?php if(wire('user')->hasRole('demo-user')) { wire('config')->demo = true; } ?> That's it ?1 point
-
1 point
-
Hi. I have a problem with the "link field" and PW 3.0.96 . When I try to select a page (page tree) the "Choose" button disappears. Unfortunately it is no longer possible to make a selection. Does anyone have the same problem or a quick solution for it? I think the error is not the module, but the file "ProcessPageList.js" Thanks, Robert1 point
-
Not totally sure what you mean - you just want to save having to click "Add Filter" to add an email address row? You can use a hook in /site/ready.php: $wire->addHookBefore('ProcessPageLister::execute', function(HookEvent $event) { if($this->config->ajax) return; $process = $event->object; // Just for the Users lister... if($this->page->name === 'users') { // Add to existing defaultSelector (or alternatively you could overwrite defaultSelector) $process->defaultSelector .= ', email%='; } });1 point
-
Yes, currently it is the only way. I dislike how it is currently refreshing the whole recurme field when a date is excluded. Something that I have on my list to improve. Even so, we have had really good success with our users (clients) excluding dates this way. Have you tried the live example of the Recurme field on the website? http://www.99lime.com/modules/recurme/iframe-demo/ Now, you have given me a new idea for handling exclusions that I think could be more elegant. Thanks!1 point
-
For the input type, you should be able to set it like this: $f->set("inputfieldClass", "InputfieldCKEditor"); The text formatters setting works the same, only it expects an array of values (in order of execution): $f->set("textformatters", array("TextformatterEntities")); There's also documention for inputfield dependencies in the API docs.1 point
-
Just wanted to throw in my two cents. If you come at it as a front-end developer that's a complete beginner to CMSs, then PW should be very easy to get going. It's built around working the same way that existing web technologies work… Pages map in the same way that URLs do… Template files are just plain HTML/PHP files… the API is largely the same as a front-end API (jQuery)… and so on. So if you know your basic web technologies outside of CMSs, then you won't find a simpler system than ProcessWire. The problem is most other CMSs don't work that way. So the line gets more blurry when you've become used to the terminology and approach of another CMS, because PW can be quite different. Sometimes you have to unlearn what you know from elsewhere in order to appreciate the simplicity of PW. People are always trying to find complexity that isn't there, especially those that grew up on other platforms. PW is a system that rewards you by being curious. We aim to show you how to fish so that you can catch the big fish. We're not here to catch the fish for you. You don't have to know anything about fishing, but you should know how to yell for help if you fall in the water. And you should be willing to learn by example. I learn best by example, so this is the way I tend to teach too (and I recognize not everyone learns the same way). PW is a CMS and CMF, not a website builder. If you are curious and willing to explore, you'll find it is very simple indeed. Certainly far simpler than even WordPress in creating a custom website. You do have to come from the point of view of "I want to create and have the system adapt to me" rather than "I will create something based on what the system provides." If you already know what you want to create and it's something unique, you won't find a simpler path to get there than PW. WordPress is a different beast, in that it's basically saying "YOU WILL CREATE A BLOG or modify this blog and call it something else." Some people like that underlying structure… "okay, we're starting with a blog, what can we do with it?" Others do not like that underlying structure. Our audience consists of those that want to have a system support their original creation rather than mash up an existing creation. There was a PDF posted earlier that I think hit upon some good points, and I appreciate the effort that went into putting it together. The fictional character being scripted in the dialog is not our target. I can go into specifics if anyone wants me to, but I was definitely left feeling at the end of it that we have to be careful about hand-feeding too much or else we'll start attracting people beyond our support resources. Folks that want the fish cooked and filleted rather than folks learning to fish. Perhaps in time we will want to attract more of the consumer-type audience, but currently I don't know how to support users looking to find all the answers in a sitemap file. Keep in mind that unbridled growth is not necessarily desirable. Most of us don't get paid for most of the work we do here and we do best if we grow in a more healthy manner, attracting more thoughtful designer/developers that are here to learn and also contribute. Obviously the author of the PDF is one of the thoughtful ones (and the PDF is a great contribution), even if his fictional character isn't necessarily, but we'll welcome him anyway. But we will definitely be going through the PDF in more detail to learn and improve from it where appropriate, while keeping our audience in mind. I think we're doing something right, because our audience is growing rapidly. I'm nearly full time on ProcessWire now, and it's still difficult to keep up with everyone. At present, I like that our audience is largely open-minded, curious and thoughtful designers and developers. Somehow we've attracted an incredible quality of people and that's what makes this place great. We could not ask for a better group of people here. I'm reluctant to lead PW towards a website builder direction because I think that's when the quality of the community could go down, as people come looking to eat fish rather than learn, catch some fish, and throw some back. The reality is that part of our long term goals include converting the rather large audience that has outgrown WordPress into ProcessWire users. I'm convinced that we do that by giving them more ProcessWire, and not more WordPress. But at the same time, we always have to keep an eye on WordPress and learn. They've been lucky no doubt, but they are also doing many things right. So we have been and always will be working to make the WP-side of users more comfortable in ProcessWire, while also trying to help them grow by distancing them from the limited WP mindset.1 point