Jump to content

Leaderboard

Popular Content

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

  1. I wouldn't touch that if I were you. No need to. ProcessWire already has got you covered. You could probably get away with less than 10 lines of code..Something as simple as...OK...before that, let's break this down. Server-side processing: is probably easier than client-side processing. The former is easier (IMO), because PW has got you covered...Throw some PW API in your template file and you are sorted. You only need to send back data in the format requested by the client, in this case DataTables is the client. Client-side: would have been a bit more difficult (for me...because I find PHP easier than JavaScript ). However, in this particular case, we are covered. DataTables does all the heavy lifting. All we need to do is to give it data in the format and structure it has requested. Requesting data: First, the JavaScript needed to request data (i.e. the client requesting data from the server)..Straight from the DataTables example $(document).ready(function() { $('#example').DataTable( {// the ID of your HTML table "processing": true, "serverSide": true, "ajax": "scripts/server_processing.php"// this is the only thing to change RE ProcessWire(template file) } ); } ); Nothing fancy in that code. The value passed to the ajax property is the important thing here. In ProcessWire, we won't be able to access a PHP file directly like that (see forum posts about this). We have two choices. Either, post to self (./) - notice the dot, or post to an existing PW page. So... $(document).ready(function() { $('#example').DataTable( { "processing": true, "serverSide": true, "ajax": "./"// posting to self (i.e. the current page) //"ajax": "/ajax-handler/"// posting to a ProcessWire page titled Ajax Handler that lives off the root } ); } ); Process ajax request: In the template file of the 'page' or the 'ajax-handler' page, depending on the value set to 'ajax' in the JS above, you will have code like so, ready to receive ajax requests..@see if($config->ajax) { // here we are listening to ajax requests sent to this page /* 1. listen (could be POST or GET. in the DataTables example, it is using GET 2. Check and sanitize required parameters 3. Kosher? Send back data in the format requested, i.e. JSON. Otherwise, ignore, show error or tell them to take a hike */ } // output HTML as usual => e.g. @see the HTML tab in the DataTables SSP example OK, the fun part. Fire-up Firebug and go to the 'Console' Tab. Visit the DataTables SSP page and watch the Console. Have a look at: Params tab: DataTables has sent a long request. Most of the stuff we will not need. The key here is to match the parameters to their corresponding ProcessWire terms, i.e. limit, sort and start. That's all we need. This is basically pagination. So, let's match stuff we need for pagination... DT => PW start => start length => limit sort // @note: index-based naming, where 0=first DataTables table column. // In this case, the value is 5 (i.e. the last column in the SSP example = salary) order[0][column] 5 => sort (sort will correspond to whatever property in your selector, e.g. title, some_text_field, etc) order[0][dir] asc => sort order in ProcessWire. if asc, do nothing, if desc then sort becomes -sort So, we get our data as normal in ProcessWire. Note, this code goes within the if($config->ajax){} condition... // @note: here you sanitize inputs + could do some other logic, e.g. check if input present, etc $start = (int) $input->get->start; $limit = (int) $input->get->length; $sort = $sanitizer->name(?)// @this is your homework; how to get to the order[0][column] and order[0][dir] values. ;-) {dir here is direction, btw} $data = $pages->find("template=basic-page, start=$start, limit=$limit, sort=$sort"); if(count($data)) // { // need to send back data with some extras to DataTables // @hint: have a look at the structure of the JSON. // @continued below... } else //error message, nothing found Next, have a look at either the 'Response' or 'JSON' tabs. That is what the server has sent back. The most important thing to note is that that was originally an array on the server (built from our $data above with some extras...). Let's build this next. if($config->ajax) { // @note: this is built from the $data above /* @note: as per the JSON tab in Firebug we need to send back 4 'things' to DataTables. 1. draw (int): I thought corresponds to the page number but seems to increment: I'll let you find out 2. recordsTotal: Number of records found 3. recordsFiltered: I haven't checked what this is 4. data: The ProcessWire find results */ // to get the total number of records: $total = $data->getTotal(); $dataDT = array();// we'll send this back to DataTables as JSON $data['draw'] = $whateverDrawIs;// could be $limit = $data->getLimit(); $data['recordsTotal'] = $total; $data['recordsFiltered'] = $whateverThisMeans; // prepare values to send back that match your DataTables table headers foreach ($data as $d) { $dataDT[] = array($d->title, $d->name, $d->id, $d->parent->title, $d->template->name);// each record } // send data back to client in JSON format (@see the JSON tab in Firebug) header("Content-type: application/json"); echo json_encode($dataDT); }// end if ajax And that's it Written quickly in browser, got carried away...there could be errors, blah blah, the usual disclaimers
    5 points
  2. I was hoping for something more like Lister (rows, columns, sorting) but with thumbnails. It just seems like information is being obscured in order to have a more front-end kind of design. Casting my vote for... A way to see all the image filenames clearly, not truncated and supered over an image. A way to see how they are tagged & described without having to drill into each one. Thumbnails with same aspect ratio as the original image (cropped to square is the visual equivalent of all caps)
    4 points
  3. Hi Mischa Just wanted to chime in here in case this is a question coming from your client. I don't know of any instances of PW being hacked but the reality is probably nothing is un-hackable. It all depends on the ambition and resources of the hacker Vs the robustness of the platform. I'm not trying to scare you here but when my client asks me "if PW has ever been hacked" it's good to set expectations. Unless you specifically wish to get into a situation where you're responsible for security, then don't be accountable for that. if Microsoft, Sony, US Government still get hacked with a security budget of (probably) millions and a security team outnumbering yours, then it tends to illustrate that any online platform has the potential to be hacked. A thorough and regular backup agreement is your best asset here so at least if you do get hacked, you have some type of salvageable website until you identify the source of the hack. Hacks can come in the form of hosting vulnerabilities, poor password storage practices, hacks via 3rd party modules or scripts, database exploits etc etc If any of these were targeted and your site was down, to your client it would all amount to the same thing "PW has been hacked". The reality is, a hacked PW site might be completely unrelated to PW and security. Just for the record, I believe PW has an extremely positive security record More importantly, I imagine if anything was found, there would be a very fast response from Ryan and Co.
    4 points
  4. Hey Tim, There are several options: Install a module like Protected Mode or Maintenance Mode. This way bots won't crawl into your website since you have to be logged in. Use a robots.txt or the meta tags as you describe. I prefer option 1 since it's a matter of keeping everyone out except clients with an username and password. The disadvantage of option 2 is that you will have to remember to remove both when deploying to live.
    3 points
  5. Hi, Mischa, and welcome. Good reading on the subject (which you may have already seen) - https://processwire.com/docs/security/ https://processwire.com/talk/forum/40-security/ Very detailed info on change logs etc - https://github.com/ryancramerdesign/ProcessWire/ Has PW ever been hacked? Not that anyone AFAIK knows about. Could it be? Front end security is your responsibility see https://processwire.com/api/variables/sanitizer/ What about back end? Well, ImageMagick has been found to have vulnerabilities recently, so there is always the possibility of zero-day vulns affecting PW, but that applies to every use of 3rd party libs. (Not a complete answer, but I'm sure others will chime in!)
    3 points
  6. Hi, for a very common task like SEO, it might be also worth to: 1) Make use of the fields import/export to share the set of SEO fields betweend pw installations 2) Add the SEO fields with a small custom script making use of the API An example of it can be found on processwire-recipes.com Greetings Edit: Link http://processwire-recipes.com/recipes/add-fields-to-template/ Edit2: Or actually just create the whole set of your SEO fields (+adding them to templates) in a reusable script
    3 points
  7. Only thing I know is with ProCache, there you can globally toggle it with a single click.
    3 points
  8. I think the new Images field is really nice. Beautifully designed and miles ahead of the old images field. I have to admit though. I really miss a list view. I'm not saying I miss the old list view but I think a list view is needed. Right now I'm working on several galleries of images with many similar images (cropped and non cropped) It's not practical with several images to hunt around via tool-tip for the image information. With a list view, I can see what I want instantly.
    2 points
  9. @adrian Any chance of adding this (and any other non-repo'd modules) to the module repo? Would make them easier to find.
    2 points
  10. foreach($product->image as $image) { $page->images->append($image->url); $page->images->last()->tags = "tag1 tag2"; }
    2 points
  11. http://jacinto-lda.com/ This is an "engine overhaul" of an existing site. Design was kept pretty much the same, but the proprietary CMS was replaced by our beloved PW, and it was made responsive, SEO and share friendly. This project prompted the ImageMarker Fieldtype & Inputfield module, coded by @Kongondo. You can see it in action in the Company / International page. Other features include a very custom vehicles catalogue. Translations are a work in progress, so some out of place portuguese is expected.
    2 points
  12. Just to add to Sebii's answer, see https://processwire.com/talk/topic/9813-copy-template-via-api/ You could create a template with your 'standard' fields and clone it as above for reuse and extension.
    2 points
  13. I was just trying to be funny here that's why the smiley. But it's true that it's often hard to put things right, especially because a wrong wording or term can easily modify the meaning. Otoh you "natives" seem to have a good sense for understanding malformed posts
    2 points
  14. Hi Arturg, I don't know if you were able to get your code working or not. LostKobrakai's suggestion is very solid of course. I just thought this link to good old StackOverflow might also help you see why the code you posted will only pick up one file. http://stackoverflow.com/questions/5444827/how-do-you-loop-through-files-array Search for the answer given by Decent Dabbler . I think his or her answer would be the easiest to adapt to your code to get it working. Basically the problem with the code you posted is that it isn't iterating through the $_FILES array. As you said, it's working for one file, so wrapping it in a foreach loop, as done in the example should fix things up for you. Throwing out advice like this in a forum is new to me. I've never participated in a forum before. I hope what I've posted is of some additional help. It keeps me out of trouble. Have a good one...
    2 points
  15. You could do this in admin.php (above the line that brings in controller.php): $wire->addHookAfter('AdminTheme::getExtraMarkup', function($event) { $extras = $event->return; $extras['head'] .= '<link rel="shortcut icon" href="'.wire('config')->urls->templates.'favicon.png">'; $event->return = $extras; });
    2 points
  16. That's not possible in a single selector. Sort order can only be 'hierarchical' for the whole result set and not different for just a subset.
    2 points
  17. One more: Loop pages in ProcessWire without building a $pageArray. This is useful for when a find() would return too many results to keep in memory. $selector = "template=pages_template"; // as an example while (1) { $p = wire('pages')->get("{$selector}, id>$id"); // get page with id bigger than previous if(!$id = $p->id) break; // assign current page's id to $id or break the loop if it doesn't exist // do stuff using $p as the current page wire('pages')->uncacheAll(); }; This served me well when I had to modify thousands of pages in one go. Works great with bootstrapping from the terminal because it doesn't affect the viewing of the website.
    2 points
  18. JqueryFileUpload This module is a ProcessWire implementation of the awesome Blueimp jQuery File Upload plugin. Server-side, the module provides a custom uploads' handler enabling you to perform various tasks with ease. The module is an interface of the feature-rich Ajax File Uploads widget provided by the jQuery File Upload plugin. The module is completely customisable and can be used both in the front- and backend (e.g. in a third-party module). Please read the README carefully and completely before using the module Release Status: Stable. Module Download: http://modules.processwire.com/modules/jquery-file-upload/ Issues tracker Project page: GitHub Security The module has been written with security in mind and makes no assumptions about any client-side validation. Instead, the module provides robust server-side validation of uploaded files. Server-side, no Ajax requests are honoured unless specifically set via configurable options server-side. This means that client-side requests to upload, delete and list files are not executed unless allowed server-side. By default, files are uploaded to a non-web-accessible (system) folder and files previously uploaded on the server are not sent back for display unless that setting is enabled. However, developers are still strongly advised to implement any other feasible measures to guard against malicious uploads, especially if allowing frontend uploading. For instance, developers can use native ProcessWire checks to limit access to the widget (e.g. only allowing uploads by registered/logged-in users). Demo A short video demo can be found here (and below )(CSS is WIP! ). In the backend, you can see it in action within the (upcoming) module Media Manager Features Fast Ajax uploads. Client and server-side validation. Client-side image resizing (highly configurable options). Beautiful touch-responsive image gallery preview. Audio and video previews pre-upload. Chunked and resumable file uploads (currently client-side only; server-side handling planned). Drag and drop support. Copy and paste support (Google Chrome only). Progress bars. Cross-domain uploads. Single or multiple uploads. Delete uploaded files. Documentation On GitHub. Have a look at the long list of available options. License Released under the MIT license @Credits: Sebastian Tschan @Thanks: Pete and BernhardB for the idea. Please test and provide feedback. Thanks!
    1 point
  19. I've just added a pull request for a ProcessWire driver to laravel valet: https://github.com/laravel/valet/pull/55/files For anyone wanting to have a quick local dev environment (on a mac) you should certainly take a look. https://laravel.com/docs/master/valet
    1 point
  20. Hi. I switched to PW from Seblod. In seblod we have field called "Field group". This field just group some fields to logical group. I think it's quite useful feature. For example: in almost all templates i have fields for SEO like title, description, index etc. ( seven fields ). In current PW workflow ( as i know ) i have to go to every field and set needed templates for it or go to every template and set needed fields. It's quite sadly If we could to have some sort of group field it became easily. Just put one field to every template. Maybe i miss something and this field is already in PW?
    1 point
  21. Shortest topic in history. I keep assuming things will be more complicated than they are in PW, The below works if anyone else is looking for the answer. $pages->find("template=articles, category=localnews, id!=34|56|87")
    1 point
  22. Actually, we could just start a thread (and pin it) in the modules forum that collects all known "non-repo'd" modules shown up by a google search of the forum and github. Might be more appropriate.
    1 point
  23. Following up on the idea of some tool to do this, take a look at the module attached to this post: https://processwire.com/talk/topic/8406-set-multiple-templates-role-access/?p=81711 It will let you add selected fields to selected templates.
    1 point
  24. I see - though, I admit: I'm pretty new to debug/profiling tools myself. It's quite simple, and I quite like XDebug, which is essentially a PHP extension that can profile your code as and when it is executed. It simply output the data to a file, which can then be opened using a client app. I'll continue work on Jumplinks 2 as soon as I can. There are already performance boosts in terms of PW3 and the new module structure. Also, I think I'd like for the module to make use of SQL statements that limit what is returned - that way, it doesn't have to loop through large sets of data. Lots of work ahead of me...
    1 point
  25. I think there is still an outstanding bug (https://github.com/ryancramerdesign/ProcessWire/issues/1803) with images on user pages - it seems like outputformatting is always off which results in the need for first(), even when maxFiles is set to 1. Try this: $user_image->first()->url
    1 point
  26. No clarification needed I work from home on my own all day so I rely on the PW forums for my daily humour :-/
    1 point
  27. Ah, glad that you found an easy way.
    1 point
  28. Hi impatient Pete, I have edit your post and added the link to the new AdminThumbOptions array on Github. The PW 2.5 is obsolete with PW 3.0.17, so this is important to know, and not to rely on the old settings! And just to clarify: I wrote "Hey you impatient PW users", not "Hey you impatient PW user".
    1 point
  29. Hi Horst, yes, I came to a similar conclusion; the additional arrays only makes everything more difficult. Or rather, I'm making it more difficult then it should be... I wanted to use them though, because I needed to access the same entry (say entry #1) from three different fields. Kind of confusing to be honest. I just changed it over to using the description and tags field, as you suggested, as I only needed two other fields to arrange everything. So this way I can also stick with the getRandom, instead of needing the rand() function. The description field is now used for the project-url, and the tags field to check if the text on the image needs to be inverted or not. Works like a charm! Didn't know about the images-extra module though, so that's a good one for future reference, thanks! And the count which is 1-based vs the array was also something I was struggling with before/encountered earlier, but now managed to completely avoid!
    1 point
  30. I cannot follow for what you need all those arrays besides the images-array? In the images-array all informations are accessible, why do you need to populate additional arrays with redundant data? I clearly haven't checked what you want to do here. You get you a random image from a multiple images field (what is a wirearray). And now, where is the other data that you need to find, before you populate all those arrays? I'm also not sure if this is correct: $rand_nr = rand(0, $h_images->count()); or if it should be $rand_nr = rand(0, $h_images->count() -1); Images->count is 1-based and numeric array indexes are zero-based. ---- But back to the main question. Is it right that you have an images field and a list with links that is somehow paired one by one, but lives in different objects? What do you use to store the links in? Wouldn't it be possible to write the links directly into an images field (by default, you have descriptions and tags field, but with a module like images-extra, you can add as many fields to the images as you need).
    1 point
  31. Crops are variations, and they clearly should be removed! But they will be recreated automagically to the exact last selected crop-rectangle and with your used values for quality and sharpening. It can do that because we save every named crop with your last selected coordinates into the metadata of the original image. So, even if the crops are gone, if you recall it via API, it recreates a new one. (At least it is expected to do so)
    1 point
  32. There shouldn't be any difference as both are essentially the same. find() does internally create a new PageArray anyways.
    1 point
  33. Nice work! Just a heads up that on the International page the map marker for the export to New Caledonia is actually sitting on New Zealand, not New Caledonia.
    1 point
  34. Work it out myself. Maybe someone need the answer. Here it is. 1. Download mpdf 6.0 from http://www.mpdf1.com/mpdf/index.php 2. copy the Sun-ExtA.ttf file to /path/to/your/web/site/modules/Pages2Pdf/mpdf/ttfonts 3. add the following lines to /path/to/your/web/site/modules/Pages2Pdf/mpdf/config_fonts.php "sun-exta" => array ( 'R' => "Sun-ExtA.ttf", 'sip-ext' => 'sun-extb', ), 4. change the mode to R in WirePdf module config page 5. Chang fonts to sun-exta in WirePdf module config page Done. Gideon
    1 point
  35. By the way, for anyone interested: For an aforementioned spring cleaning there is a little module existing already (credits to Horst and tpr): https://processwire.com/talk/topic/261-where-to-set-image-resizing-quality-and-how-to-re-resize-images/page-2 Update: A WARNING: Right now, that spring cleaning module treats crops as "variations" and resets them too - which normally is not desired.
    1 point
  36. I understand your frustration. Especially dealing with default fields like SEO. You could build something around the ProFields? You can group field over there. You can create a Textareas of Table field which makes it a lot easier to handle grouping of fields.
    1 point
  37. One more thing I forgot to ask: how can new "users" figure out the what these icons mean?
    1 point
  38. Short answer: There isn't. But it's been discussed multiple times, the latest one here: https://processwire.com/talk/topic/13021-wishlist-group-field-for-grouping-fields/#entry118225
    1 point
  39. If there are image variations present, you need to add a 'forceNew' => true to your options array. But this shouldn't stay always in your code. So, you need to find a way to manually or half-automated set a flag if the following derivatives should be recreated or not, I think.
    1 point
  40. Update: Version 007 Changelog As per the request by @heldercervantes , coordinates table can now be manually sorted.
    1 point
  41. Sorry maybe I wasn't clear: Any child that is featured=1 will be sorted by the time they are on, and any child that isn't featured will be ordered alphabetically.
    1 point
  42. You Europeans make me smile - your English is probably better than mine Latest version comes with a few general tweaks/fixes, but the most significant are related to the Selector panel based on our recent discussions. It now returns to the "Sticky" state when you reload after a "Once" change (previously, it returned to default from the config settings). There are also now icons indicating if: the panel is set in the default list in the module config settings ("Tick" icon), the state of the panel is different for the current view, ie you have made a "Once" change (number "1" icon) In the following example, you can see that: Debug Mode is disabled. Default is enabled (checkbox icon). There is no "1" icon so it is a Sticky setting. ProcesswireInfo is disabled. Default is enabled (checkbox icon), There is a "1" icon so you know it's a "Once" only setting. Validator is enabled. Default is disabled (no checkbox icon). There is a "1" icon so you know it's a "Once" only setting. Hope that all makes sense and provides a quick visual of what the current panel settings are and what they will be when the page is reloaded.
    1 point
  43. Hey, you impatient PW users, here is a intermediate version for the current PW 3.0.17 devns branch. It is only available in the Github PW3-Tree. (you need to upload and install manually) Attention: Please first install the InputfieldRangeSlider module. It is required for the new version! The module now sits upon the new core Imagefield and provide a few more configsettings as the PW 2 version: disable enable the core image editor (default: disabled) should Imagenames be displayed by default (default: off) should Thumbnails be displayed complete, not a cropped square (default: off) style settings (color and transparency) for Thumbbackgrounds max char number for Imagebasenames (please adjust according to the length of your GridSize) (default: 15) globally disable the individual selection for Quality and Sharpening, instaed use the ImageSizerEngines defaults or define globally static defaults In the Inputfield itself, you are able to toggle displaying the Imagenames and how the Thumbnails are displayed: cover or contain. There is also a textinput for filtering by basenames. Screens:
    1 point
  44. What about leaving the outer_tpl => "||". Then add the first ul and the first li yourself? Do you mean the "parent" class that gets added by default to all active parents?
    1 point
  45. I have to say that the form API works pretty well in the frontend. I have several sites where I use it without issues. Once you get the hang of it, it is actually quite nice to interact with. Only thing I am missing is a more easy way than the current to get more control over the rendered markup. Formbuilder comes to the rescue here. If I remember correctly, when UI framework support was introduced to formbuilder, Ryan stated that the core functionality was altered to easier support UI frameworks. But I never found any hints on how to easily alter rendering of form markup (especially field wrapper's markup and attributes) other than through hooks. Nevertheless, I agree that it would be nice to have a docs section dedicated to this topic. Or at least have a link collection to relevant forum posts that deal with frontend forms, processing and saving of input values. Links I can come up with quickly: https://processwire.com/talk/topic/2089-create-simple-forms-using-api/ and, of course, Soma's great gists (big kudos) https://gist.github.com/somatonic/5011926 (build and process generic forms from page templates) https://gist.github.com/somatonic/4027908 (build and process forms manually with API) https://gist.github.com/somatonic/4150974 (upload images) https://gist.github.com/somatonic/5415646 (form with fields in table) https://gist.github.com/somatonic/5233338 (manual form markup with file upload handling)
    1 point
  46. Filetype is JPEG you said? If you change things for testing purposes, you can add a param "forceNew" => true to an options array to always override previous versions. And if you want check filesize compared to quality settings you can use the suffix setting for a complete check loop like that: $img = $page->images->first(); // grab you an image (change code to match your setup) $newWidth = ($img->width == 2500) ? 2499 : 2500; // set a width value different than the original image size! (is needed for the test only) $qualities = array(100, 90, 80, 70, 60, 50, 40, 30, 20, 10); foreach($qualities as $q) { $options = array('forceNew'=>true, 'quality'=>$q, 'upscaling'=>true, 'sharpening'=>'soft', 'suffix'=>"quality{$q}"); $variation = $img->width($newWidth, $options); echo "<p>variation: {$variation->name} :: " . filesize($variation->filename) . "</p>"; } Code is written in browser, if it doesn't work as expected, please check for typos or come back here and tell me. And if it works, please drop a note about the result.
    1 point
  47. I am sure lots of very cool things could be done, all of which will require a little more than the 5 mins of planning and 20 mins of coding I put into this one Here is a revised version (with a new name) with about an extra 15 mins of coding that adds support for batch adding/removing of fields from templates. I think I might actually make use of this version quite a bit. EDIT: I don't think "Template Setup Batcher" is the right name - not really about setting up templates from scratch. Oh well - maybe change again if a newer version ever happens ProcessTemplateSetupBatcher.module
    1 point
  48. hi zeka, welcome to processwire i switched from seblod to pw some months ago and i hope you will enjoy your move as much as i do! you will be impressed by the great community and the fast and knowledgeable answers you will get here, i'm sure (knowing the pain with seblods forum support...). to your question... coming from joomla/seblod you have to change your mindset a little bit, i hope that i can help you with some comparisons: articles/items (joomla/seblod) = pages (pw) in pw everything is a page! thats very important to understand. pages can store any data you want. it's like in seblod everything is stored in joomla articles, pw stores everything in pages. pages can have completely individual set of data-fields (eg. headline, body, images, starttime, endtime etc.). this setting of fields is defined by "templates": content types (seblod) = templates (pw) in your templates you define which fields will be available in your page. some examples: template "blog-post.php" # field "title" # field "body" # field "author" template "product.php" # field "title" # field "description" # field "price" # field "image" so if you created a new page "product" you would only have the fields "title, desc, price, image" available for editing. list&search (seblod) = selectors (pw) forget list&search types!! selectors are the way to go with pw say we want to display some products with template "product" from above: $products = $pages->find("template=product, price>100, sort=price"); foreach($products as $item) { echo "<a href=\"$item->url\">$item->title</a><br>"; } see here for a quick glance: http://processwire.com/api/selectors/ (yes, everything is very well DOCUMENTED - that's another huge difference to seblod ) don't try to bring editing features to the frontend unless it is REALLY necessary joomla has a very complex backend, so i tried to hide this complexity for my clients by giving them edit access only for some parts of their website from frontend. processwire's backend is so simple that you will not need to hide it from your client anyway: if you have some experience in seblod, i think you will learn pw really fast and enjoy how clear and simple everything can be and now put everything together: https://processwire.com/talk/topic/693-small-project-walkthrough-planets/ if you have no dev-environment you can instantly setup a fresh copy of processwire here for free: https://lightning.pw/ have fun with processwire
    1 point
  49. Another option that might work (though not yet tested to compare): $result = $pages->find("template!=admin, has_parent!=2, include=all");
    1 point
  50. Here's how I setup 301 redirects in my .htaccess files. These redirect directives should go probably above ProcessWire's, but after the "RewriteEngine On" directive. Here's a 301 redirect from one directory to another (/old/ to /new/): RewriteRule ^old/?$ /new/ [R=permanent,L] Here's rewriting /old.html to /new/dir/: RewriteRule ^old.html$ /new/dir/ [R=permanent,L]
    1 point
×
×
  • Create New...