Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 10/09/2016 in all areas

  1. Under pressure from a client, I had to launch a PW front end user membership site 2 months earlier than the agreed schedule. Never an ideal situ and no time to fully test everything. The client web admin and I were able to monitor the logs, esp the session logs to see who'd logged in and who'd had trouble. We immediately emailed those who'd lost/forgotten/did-not-receive-the-email-with their username. Every single one of those new members emailed back their appreciation for the proactive customer support. What could have been disastrous turned those subscribers into site fans. PW logs are your friends! Thank you Ryan, the PW dev team and every forum/module contributor for delivering such a solid product.
    13 points
  2. COMPOSER ELLIOTT CARTER (December 11, 1908 - November 5, 2012) is internationally recognized as one of the most influential American voices in classical music, and a leading figure of modernism in the 20th and 21st centuries. https://www.elliottcarter.com/ This site was launched some months ago, and was one of the larger projects I completed so far. It took about 4 month to build. (PW 2.7.3) This was the first project I used the wireRenderFile() pattern on, and it consequently allowed me to reuse a lot of output code, as well as do a lot of markup/object caching with wirecache. The site uses DataTables for all of the major listing pages, Works, Discography and Events, allowing users to filter and search with no page reload. This probably has the most advanced caching setup that I've done so far, and one example of how it works is on the discography page: https://www.elliottcarter.com/discography/ That page has to hold all 264 albums (json object which is rendered by dataTables), and each album takes a bit of processing to render (formatting of works, artists etc.). The json for each album's list view is wirecached individually and is generated on visits to the individual album pages, so that they never get generated all at once when visiting the discography page. The complete json object containing all of the albums is also wirecached, then the final page is pro-cached. The album covers are lazy loaded so as to not affect page size or load speed. The selects on the left are also all wirecached as page or regular arrays. This results in a 1.6s page load time and a page size of 1.12 MB. Without the data being wirecached the load time is around 9 seconds to generate the page, probably longer if it had to regenerate all 264 albums, but the album info never changes, so they are permanently cached unless someone edits one. Also should note that since there is so much use of wirecache, @Soma's Clear Cache Admin was pretty much indispensable for managing all of the caches. Other features of the site include extensive use of Schema.org microdata, an events submission system, and a lot of custom stuff in the admin for managing the content, such as automated fetching of album covers from Amazon, converting formbuilder submissions into events, a custom admin dashboard etc.. There are probably 60 modules in use overall, but these in particular saved the day: MenuBuilder AdminCustomFiles AdminPageFieldEditLinks All the Selectize modules URL checker PrevNextTabs WireMailMailgun SetupPageName Changelog AdminCustomPages Twitter Feed Social Share Buttons RSS Enhanced Chosen Select Runtime Markup Batch Child Editor Tracy Debugger As well as all of the pro modules (ProFields, FormBuilder, ListerPro, and ProCache). More info, screen shots etc will be gradually posted here...
    7 points
  3. You may want to take time to review the instructions on upgrading ProcessWire, which should provide adequate guidance on what to do: On the ProcessWire website https://processwire.com/docs/install/upgrade/ https://processwire.com/docs/install/troubleshooting/#troubleshooting-upgrades On Github https://github.com/processwire/processwire
    4 points
  4. Another update: the latest version logs multi-language name changes as renames. The implementation is a bit hacky since core doesn't trigger a renamed hook in this case and also doesn't track previous name etc. like it does for the default name field. The output also doesn't mention the language specifically, though that's something that could be added later on. Please let me know if you have the chance to give this feature a try and happen to notice any inconsistencies. Thanks!
    2 points
  5. A few minor optimizations: the "else" block isn't necessary no need to put the "class=\"something\"" into the variable, you just need to store the class name HTML attributes can also use single quotes, which makes assigning them in interpolated strings easier to read you have two identical if/elseif conditionals for the class and for rendering children, so you can set a flag in the first place storing the result of wire('page') in a variable (I used $page) shortens the code $a != $b is (to me) more readable in complex conditional expressions than !($a == $b) Untested: <?php // ... function renderMenu($items) { $page = wire('page'); // if we were given a single Page rather than a group of them, we'll pretend they // gave us a group of them (a group/array of 1) if($items instanceof Page) { $items = array($items); } $str = ''; foreach ($items as $item) { if ($item->showInMenu == true) { $menuText = $item->get('menuLinkTitle|title'); $currentClass = ''; $renderChildren = false; if ($page->id == $item->id) { $currentClass .= "current"; $renderChildren = true; } elseif ($page->parents->has($item) && $item->id != 1) { $currentClass .= "current-parent"; $renderChildren = true; } $str .= "<li><a class='$currentClass' href='$item->url'>$menuText</a>"; if ($page->id != 1 && $renderChildren) { $str .= renderMenu($item->children); } $str .= "</li>"; } } // if output was generated above, wrap it in a <ul> if ($str) { $str = "<ul>$str</ul>"; } return $str; }
    2 points
  6. First things first: what do you need this for? If it's a style-related thing use attribute selectors instead. Basically the same thing goes for JavaScript stuff. If you really need a server-side solution to this, the polite thing to do would be giving it a try yourself before asking someone to do it for you. That being said, what you are asking for would mean a) checking that the link isn't relative (href="/foo/" or href="index.html") and b) checking that it doesn't point to your own site (href="your-own-site...) It's really not a very difficult thing to do if you put your mind to it, so why don't you give it a try and if you run into any issues ask help with those?
    2 points
  7. Wanted to mention that there's a new dev version https://github.com/somatonic/Multisite/tree/dev2 that we are testing and using right now. It was tested and works with multilanguage and PW3 various features.
    2 points
  8. @DL7 no i think you may be confused about the standard cropping built into the core. this module allows you to define various crops and you have to call those by name in the api output code. It does not replace or affect the original image at all.
    2 points
  9. Nice team effort and thanks Francesco Schwarz and the other people for creating time to handle the issues. Looking forward to new demo front.
    2 points
  10. I have been using this module for a long time and it's been incredibly useful so I thought it was time to share. It's great for fields where you want to instruct content creators to reference something about a the page, its template, or its parent, or grand parent, etc Specify fields/properties of the page in your field's Description or Notes content, eg: [page.parent.url] [page.title] [page.template.label] You can also define a str_replace to be performed on the returned value, eg: [page.name.(-|_)] which will return the page name with the dashes replaced with underscores. An option to allow raw HTML is available. You can also use hanna codes within your description and notes fields - big thanks to @Robin S for this idea. http://modules.processwire.com/modules/dynamic-description-notes/ https://github.com/adrianbj/DynamicDescriptionNotes/ Hope you find it useful.
    1 point
  11. Hi Guys, So after reading multiple threads and searching for a solution required for a project, I decided to build a module to enable users to login to the CMS via their gmail account and hopefully the module can also be altered for LinkedIn and other Social accounts. Unfortunately the Facebook module does give you a Facebook ID and assigns the Facebook Role however I would like to assign the role, get the users email and create the user if its not in the system. I have basically taken the Facebook Login Module created by apeisa and manipulated the module to somewhat work with GMAIL. What it does now: It allows you to login but doesn't pull any data from GMAIL. Therefore it automatically logins in to the first account created in ProcessWire, but oddly changes the password, Im sure its due to the line of code in the module that is set to generate a random password via sha1. What I need it to do: If the user isn't in the system, get the gmail email, add the gmail email to the email field in ProcessWire, assign the gmail role or whatever role I want to auto assign it and log them in. ​My resources from Google: https://developers.google.com/accounts/docs/OAuth2 Please note, I will be updating the code as I make progress but please give input or help if you can. As always, thank you so much to everyone for their input and help, especially apeisa and craig a rodway for giving some direction initially. Here is what I have so far: <?php class GoogleLogin extends WireData implements Module, ConfigurableModule { const name = 'google-login'; //the google ID isn't used in Gmail so I am sure this will go away. const fieldName = 'google_id'; public static function getModuleInfo() { return array( "title" => "Google Login for Website", "version" => 001, "summary" => "Allows users to authenticate through their GMAIL account.", "autoload" => false ); } public function init() { } public function execute() { // Prevent association of Google Account to an existing user if ($this->user->isLoggedin()) { echo "Already logged in."; return; } $client_id = $this->googleAppId; $app_secret = $this->googleAppSecret; $redirect_uri = $this->page->httpUrl; $code = $_REQUEST["code"]; if(empty($code)) { $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection $dialog_url = "https://accounts.google.com/o/oauth2/auth?client_id=" . $client_id . "&redirect_uri=" . $redirect_uri . "&state=" . $_SESSION['state'] . "&scope=profile email&response_type=code"; echo("<script> top.location.href='" . $dialog_url . "'</script>"); } if($_SESSION['state'] && ($_SESSION['state'] === $_REQUEST['state'])) { $token_url = "https://accounts.google.com/o/oauth2/auth/access_token?" . "client_id=" . $client_id . "&redirect_uri=" . urlencode($redirect_uri) . "&client_secret=" . $app_secret . "&code=" . $code; $response = file_get_contents($token_url); $params = null; parse_str($response, $params); $access_url = "https://accounts.google.com/o/oauth2/auth/user?access_token=" . $params['access_token']; // Add stream context $options = array('http' => array('user_agent'=> $_SERVER['HTTP_USER_AGENT'])); $context = stream_context_create($options); $ghUserData = json_decode(file_get_contents($access_url, false, $context)); $this->processLogin($ghUserData); } else { echo("The state does not match. You may be a victim of CSRF."); } } public function processLogin($ghUserData) { $id = $ghUserData->id; $u = $this->users->get("google_id=$id"); // First we create random pass to use in login $uniqid = uniqid(); $pass = sha1($uniqid . $id . $ghUserData->updated_at); // User has logged in earlier with Google id, great news let's login if ($u->id) { $u->of(false); $u->pass = $pass; $u->addRole(self::name); $u->save(); } // User has not logged in before and autogenerate is on else if (!$this->disableAutogenerate) { $name = $this->sanitizer->pageName($ghUserData->name, true); $u = $this->users->get("name=$name"); // All seems to be fine, let's create the user $u = new User; $u->name = $name; $u->google_id = $ghUserData->id; $u->pass = $pass; $u->addRole(self::name); $u->save(); } else { echo $this->renderCreateUserForm(); } $this->session->login($u->name, $pass); $p = $this->pages->get($this->redirectPage); if (!$p->id) { $p = $this->pages->get(1); } $this->session->redirect($p->httpUrl); } public function renderCreateUserForm() { } static public function getModuleConfigInputfields(Array $data) { $fields = new InputfieldWrapper(); // since this is a static function, we can't use $this->modules, so get them from the global wire() function $modules = wire('modules'); $field = $modules->get("InputfieldText"); $field->attr('name', 'googleAppId'); $field->attr('value', $data['googleAppId']); $field->label = "Google App Id"; $field->description = 'Client Id for your project. You can create one from here: https://console.developers.google.com'; $fields->add($field); $field = $modules->get("InputfieldText"); $field->attr('name', 'googleAppSecret'); $field->attr('value', $data['googleAppSecret']); $field->label = "Google App Secret"; $field->description = 'Client Secret for your project. Available in your project console here: https://console.developers.google.com'; $fields->add($field); /* $field = $modules->get("InputfieldCheckbox"); $field->attr('name', 'disableAutogenerate'); $field->attr('value', 1); $field->attr('checked', empty($data['disableAutogenerate']) ? '' : 'checked'); $field->label = "Don't set username automatically, but let the user choose username when doing the first login"; $fields->add($field); */ $field = $modules->get("InputfieldPageListSelect"); $field->attr('name', 'redirectPage'); $field->attr('value', $data['redirectPage']); $field->label = "Page where user is redirected after succesful login"; $fields->add($field); return $fields; } public function install() { $name = self::name; $fieldName = self::fieldName; $page = $this->pages->get("/$name/"); if($page->id) throw new WireException("There is already a page installed called '/$name/'"); $template = $this->templates->get($name); if($template) throw new WireException("There is already a template installed called '$name'"); $fieldgroup = $this->fieldgroups->get($name); if($fieldgroup) throw new WireException("There is already a fieldgroup installed called '$name'"); $field = $this->fields->get($fieldName); if($field) throw new WireException("There is already a field installed called '$fieldName'"); $role = $this->roles->get($name); if (!$role->id) { $this->roles->add($name); $this->message("Create role called $name"); } $fieldgroup = new Fieldgroup(); $fieldgroup->name = $name; $title = $this->fields->get('title'); if($title) $fieldgroup->add($title); $fieldgroup->save(); $template = new Template(); $template->name = $name; $template->fieldgroup = $fieldgroup; $template->allowPageNum = 1; $template->save(); $this->message("Installed template $name"); $page = new Page(); $page->template = $template; $page->parent = '/'; $page->name = $name; $page->title = "Google Login"; $page->addStatus(Page::statusHidden); $page->save(); $this->message("Installed page $page->path"); $basename = $name . ".php"; $src = $this->config->paths->SessionGoogleLogin . $basename; $dst = $this->config->paths->templates . $basename; if(@copy($src, $dst)) { $this->message("Installed template file $basename"); } else { $this->error("Templates directory is not writable so we were unable to auto-install the $basename template file."); $this->error("To complete the installation please copy $basename from $src to $dst"); } // Create hidden inputfield $input = new InputfieldText; $input->set('collapsed', Inputfield::collapsedHidden); // Create field called Google and set details and inputfield $f = new Field(); $f->type = $this->modules->get("FieldtypeText"); $f->name = $fieldName; $f->label = 'Google ID'; $f->description = 'Stores Google id for user'; $f->inputfield = $input; $f->save(); // Add the field to user fieldgroup (basically means user template in this context) $fg = $this->fieldgroups->get('user'); $fg->add($f); $fg->save(); } public function uninstall() { } }
    1 point
  12. A quick look at http://bielenberg-soerup.de seems pretty okay on an Ipad Mini, both landscape and portrait. http://malabu.de has some issues on portrait because the sidebar menu gets partially covered by the content, but not unusable. You can see for yourself when resizing your browser window!
    1 point
  13. Hi Cacrura, Perhaps I did the first image indeed via the natice cropped function. My apologies for the confusing.
    1 point
  14. That's why the settings are in config.php https://github.com/somatonic/Multisite/tree/dev2#add-multisitedomains You'd have a config already for both so it's just a matter of having different domain and the root in PW stays the same.
    1 point
  15. Or just use this module for automatic upgrades: http://modules.processwire.com/modules/process-wire-upgrade/ Then if you want to downgrade you can use the version switcher in Tracy to instantly switch to any previous version installed with the Upgrades module.
    1 point
  16. As you've already found nico's textformatter you could also use a:not(.external) to get all internal links.
    1 point
  17. I have a similar problem. In my case I try to change a page and save a value from this page in the user profile. Here my code: $u = $users->get(123456); $u->setOutputFormatting( false ); $u->user_activation = true; /** * get the only invoice and mark it paid * Payment if there is one invoice */ $invoices = $pages->find( "template=invoice, user_select=$u->id" ); $invoice = $invoices->first(); if ( count( $invoices ) === 1 && $invoice->id ) { $invoice->setOutputFormatting( false ); if ( $invoice->payment_rate === (float) $input->get->amt ) { /** * ERROR occurs if reloading the page with changed value (true/false) * set $u->setOutputFormatting( false ) later before the pass */ $invoice->user_activation = true; $invoice->save(); $u->payment_rate = $invoice->payment_rate; } } $pass = activationAndPassCode(); $u->setOutputFormatting( false ); // have to set it again, without it will create an error $u->pass = $pass; $u->save(); My error message was similar but there was: ... modified and saved. [pass] ... The only fix I could made for now is to put $u->setOutputFormatting(false) again before changing the password ($u->pass = $pass), even if was set in first line. Weird behaviour on my side was: after the first time the error was shown it disappeared after the second. It triggered only on the change of $invoice->user_activation = true|false. So if the value changed in $invoice->user_activation it could not run without the error. Maybe it helps to set you to set setOutputFormatting(false) before your change on the field "return_time" as the error hints to it.
    1 point
  18. Happy to do that. I'm just about to head away for a few days but will go through systematically when I'm back.
    1 point
  19. If you removed /site/config.php that will definitely cause a problem. No need to touch that file when upgrading.
    1 point
  20. This pretty much works - it just misses out the trailing slash from the original $compilerCachePath so results in a double slash in the link URL. But this could be corrected: $compilerCachePath = realpath($compilerCachePath) . DIRECTORY_SEPARATOR; Alternatively, slash replacement could be done conditional on what the directory separator is (thereby distinguishing Windows from Mac/Linux): if(DIRECTORY_SEPARATOR == '\\') $compilerCachePath = str_replace('/', '\\', $compilerCachePath); Or no conditional needed for this one: $compilerCachePath = str_replace('/', DIRECTORY_SEPARATOR, $compilerCachePath);
    1 point
  21. Hi, to upgrade or downgrade what I always do is to rename the existing wire folder then copy a new wire folder. In general thats the only thing you need to do for pw upgrade. Once you're happy with the upgrade then you can remove the old wire folder. You only have to replace .htaccess and index.php if you upgrade from pw 2.xx to 3.xx
    1 point
  22. 1 point
  23. Yes, it look good, Adrian. I will keep my choice to PW to present to the client ;-)
    1 point
  24. Oh right, of course. Yes, that would work. You're right. I'm just being lazy and leaving the file watcher at the default scope, which is all project files. But I could define a custom scope for each project, or use the preset "open files" scope and just be careful not to accidentally open AdminOnSteroids.scss
    1 point
  25. How about this for page IDs in the page list? I wanted something that is always visible but still less obtrusive.
    1 point
  26. By far many more than multisite module for PW (haven't encountered many bugs in all the years). And also more expensive
    1 point
  27. Thanks a lot Teppo, I do appreciate the effort! I'm gonna start using it and report my findings as soon as I have enough experience.
    1 point
  28. To be fair I've never had any major issues with permissions in ProcessWire: Built-in RBAC system fits most needs easily, for page-and-group-level access management we've built the UserGroups module, the DynamicRoles module provides a lot of flexibility when you can't make pre-defined groups/roles work, and, finally, when none of these approaches work I have always been able to check permissions programmatically. Sure, the last part requires some custom work and thus it's obviously not something you can just pull out of the bag and set up with a couple of clicks on some GUI.. but, unless I'm missing something obvious, this is true for most other frameworks (such as Yii or Laravel) as well. Finally, I'd like to point out that if you find yourself in a situation where the permissions on your site constantly change and there are no logical rules to define them, thus making even programmatic permission checking impossible, I'd be tempted to say that it's not a problem with the system but rather within your own design.. or, rather, the lack of it Regarding the original questions from @DL7: Depending on your time frame and definition of "60% done", I'd say that while all of this falls nicely into ProcessWire's domain you should consider finishing your first version on the current platform and then, perhaps, merging it to a more flexible platform like ProcessWire. You've mentioned multiple times the need for "custom development", so I'm not really sure if you're not comfortable with this or if it's just something you see as a benefit of ProcessWire. Either way, you should realise that with ProcessWire you will no doubt have to do custom development too. We don't have a module for everything (we're not WordPress). That being said, ProcessWire is quite likely much friendlier to develop with than your home-baked system and we have a wonderful community you can ask specific questions from. There are also some modules that could help you a lot, such as DynamicRoles and, perhaps, the commercial FormBuilder. While you can no doubt integrate your custom-built solution with ProcessWire and you can even perform direct SQL queries from within your ProcessWire template files and modules in order to utilise your own database tables (see the $database API variable), I'd strongly suggest that you don't. 99% of time using a custom database means that you are not making use of ProcessWire's features as well as you could. In some cases I've found it useful, but those cases are really, really rare. All of the data structures you've mentioned can no doubt be done via regular pages, for the editing part you could consider using the regular page editor, and you might even be able to pull this off using the built-in page tree, but if you need something more customised, you might also want to look into developing your own custom Process module (which is what I've used for a few similar use cases before). The commercial ListerPro module is another useful tool in this regard, so don't forget to check that one out too. I'm not going to try and provide you a ready-to-use structure (or page / field strategy) for your site, but feel free to draft something out and post it here so we can comment on it. Generally speaking if you have a specific question or an idea / concept you'd like to get comments for, you'll get replies on this forum in no time, but if you ask others to do the groundwork for you that won't get you anywhere
    1 point
  29. Welcome to the Forums! If it is 60% done, you are probably better off finishing it. However, if you have the time, you can start it from scratch and learn ProcessWire at the same time. Learning ProcessWire is a nice experience with a good, linear learning curve, but it is still something new to learn. For example the above mentioned "page/field/template strategy" depends on your needs and experience too, so this is something you need to examine in detail before you make the plunge. You can find a lot of topics on it in the forums and in the docs. If you want to save time on coding, look up the Modules Directory. I recommend modules with v2.7 and/or v3 compatibility. Always check out the module's forum topic to learn more about its current status and get more info on them. As for Yii2 or Laravel suggested by @Sephiroth, I do not think it is something everyone should follow, at least ProcessWire is perfectly suitable for "anything" and development can be quite rapid with it, one just needs the experience to build something quickly in any framework one uses.
    1 point
  30. In something similar, I stored this in a sort of "availability" custom database table. It was quite simple though, with two columns: day_of_week (int) time (time) The UI wasn't quite like yours - it was day of week, and then add multiple time ranges (e.g. 9am-12pm and another could be 2pm-5pm). The end result was the same as what you are wanting to achieve though. You could add an ID and/or date field as well depending on how you set up your schedule too.
    1 point
  31. I am tempted to add a few key PHP settings in another sub-section of this list - I think it could really help with quickly identifying some issues. What do you guys think of this list of metrics? mod_rewrite mod_security allow_url_fopen post_max_size upload_max_filesize max_input_time max_execution_time max_input_vars memory_limit Adding in @ryan and @horst to see if you guys have any other specific Apache/PHP settings that you think would be useful to include in Debug info. I think these (together with the pw/php/mysql/apache and module version details mentioned above should cover most common issues (including image uploading problems). Btw, if you're confused what I am talking about, scan a few posts up to see this new feature in Tracy for copying a Github-friendly formatted collpased/expandable list of debug info for inclusion in Github Issue reports.
    1 point
  32. To add to the above: We experienced this issue with an established site when moving from http to https. Login requests either threw this error or simply returned you back to the login screen after silently failing. Following trying all the suggestions posted by Nico - apart from /site/assets/ chmod 777 - as he mentions wouldn't ever recommend that for production environments To remove the issue we installed the 'Session Handler Database' module and this fixed it.
    1 point
  33. I have already replied to a related post by Joss (https://processwire.com/talk/topic/8672-forged-again/) but I just came across this topic and seems there's been a lot more discussion here regarding this "forged request" issue. Anyways, I'm running PW 2.5.3 and am experiencing the dreaded "TemplateFile: This request was aborted because it appears to be forged." error described herein while trying to log into the admin interface AND using a mobile device running iOS. I have tested the admin login successfully using droid mobile devices (both phone and tablets) , along w/ most desktop browsers including IE8-11, FF29+, and most recent Opera and Safari versions. Curious if anyone has experienced the same thing w/ iOS 7 and has a recommended fix? Note: since find this post, I have tried using Nico's tips in his troubleshooting guide regarding altering CSRF config settings (e.g. $config->protectCSRF = false;$config->sessionChallenge = false; $config->sessionFingerprint = false;). After integrating these changes, this resulted in my login request being bounced back to admin login form, without any error (and failed login). ------------ PLEASE IGNORE: FIXED ---------------------------------- Cookies must be enabled...had wrong settings.
    1 point
  34. I would also greatly suggest you use this to test sending your email : http://www.mail-tester.com. It will also provide suggestions on how to improve your mail delivery systems to prevent outbound emails to be seen as spam.
    1 point
  35. @OrganizedFellow Yes, same here. This worked for me too....along with a quick change of .gitignore! Thanks.
    1 point
  36. Posting Guidelines In addition to the rules, it is recommended that you read the following guidelines to get the most out of your interactions with this community. Interpreting other members’ posts Our community is a global community and as such posts and intentions can be misunderstood. If you encounter a reply that seems “short” and contains links to other topics that may answer your question, this may be due to the large number of members who use the forums on their mobile devices and want to help but don’t have time for a more complete reply or for whom English is not their first language. Please try and give people the benefit of the doubt when posting. Please do not dismiss their views out of hand (constructive replies are welcome). The forum language is English. We really appreciate the effort everyone makes from countries around the world to post in English. After careful consideration and experience on other forums, it makes sense to have one common language for discussion here so that ideas can be shared and not missed in language-specific forums - the same applies for debates that might get out of hand as we do not want to miss those either. There are more and more country-specific ProcessWire websites cropping up however so if you find that a group of you are in agreement and wish to set up a language-specific forum of your own then please feel free. Suggesting new modules/features Many of the features of ProcessWire have been born out of suggestions by users or discussions within the community, but that does not mean that every suggestion can be taken on board or that it might even be in tune with the overall strategy for the project. If you have suggestions for new features or modules, please feel free to propose them in a simple, open way in the Wishlist & Roadmap forum, but don’t be upset if no one is interested. Developer’s needs vary greatly. Your suggestion might well be something that is better developed as a third party module; in fact that is often the case. You are free to develop that yourself or work with others on a project, or even post a job to get help in the jobs board. However, whatever your idea or wish for a new feature, please do not make your suggestion sound like a demand, or tell the developers they have “got it all wrong,” or that you know what is best for ProcessWire. That is simply unfair to those who have been working on the project for free for years. Answering topics If you can help your fellow members then that’s great! Giving something back to the community in a constructive manner is always welcome. If someone replies in a topic you started and you think it is the best answer then please click the “Mark Solved” button at the bottom-right of the relevant post. Staff may mark a post as the best answer for you or change the chosen answer at their discretion if there is a better/more comprehensive answer later on in that topic. Some of the most prolific posters in the community do not count themselves at experts, but are very good at pointing new members in the right direction - you don’t have to be an expert in order to help out. Please don’t tell someone off for asking a silly question - there is no such thing! Every question is being asked because the person genuinely does not know the answer and might not know where to look. Raising issues or disagreements Nobody frequenting this forum should feel threatened when voicing their opinion as long as they are doing so constructively. Please be mindful however that everyone is unique and may interpret situations differently which could lead to misunderstandings. If you find that you disagree with someone, they may simply have a different point of view - this does not automatically mean that their view is wrong or your view is right. If multiple people disagree with you, it could be that a point has been raised many times before and/or that your point is not clear. Please seek clarification and remain calm or go talk about something else. If someone appears to be being simply argumentative, repetitive or belligerent in their replies then please do contact a member of staff and refrain from being drawn into the discussion further. To repeat, we are not solving world issues here, nothing is really so important that you HAVE to say something. If in doubt, say nothing and read another topic.
    1 point
  37. Scroll down a little and try the tricks on this page: http://processwire.com/docs/tutorials/troubleshooting-guide/page2
    1 point
  38. @OrganizedFellow Maybe just exclude contents of those folders, so the folders themself get pushed to your git server.
    1 point
  39. PW should and would remove stale session files. In some cases this so-called garbage collection does not work, especially on Ubuntu servers. Adding a couple lines of PHP to config.php solves this problem for most people. more info here: https://processwire.com/talk/topic/5796-session-handler-database-do-not-delete-old-sessions/?p=56596
    1 point
×
×
  • Create New...