Leaderboard
Popular Content
Showing content with the highest reputation on 07/03/2014 in all areas
-
Dynamic Roles are a powerful access control tool for ProcessWire. They pick up where traditional roles leave off, and allow you to assign permissions at runtime based on any factor present with the user. Once a user receives one or more dynamic roles (at runtime), those dynamic roles then specify what pages the user can view, edit, or add children to. If traditional roles are a sledgehammer, Dynamic Roles are a scalpel, allowing nearly any finely tuned access control scenario. Traditional ProcessWire roles are limited to assignment of view/edit/add access on a per-template basis. Dynamic roles go outside those limitations and enable you to assign that access based on any factors present with a page (i.e. match any field values). Dynamic Roles assign new access, but do not revoke existing access provided by traditional roles. As a result, Dynamic Roles can be used together with traditional roles, and the two work beautifully well together. Though Dynamic Roles can also replace all situations where you would use traditional roles for access control assignments. If using Dynamic Roles to assign page-view access, you would typically want to use traditional roles to revoke view access from at least the "guest" role at the template level. Then use Dynamic Roles to assign view access to those pages in a more granular manner. This module directly affects the results of all page getting/finding operations by applying the access control directly to the database queries before pages are loaded. As a result, it is fast (regardless of scale), pagination friendly, and requires no further intervention by the developer other than configuring the dynamic roles as they see fit. Because it relies upon new features present only in ProcessWire 2.4.6+, it requires the current dev branch. Sponsored by Avoine Concept by Antti Peisa Code by Ryan Cramer PLEASE NOTE: This module is in pre-release state (like the PW dev branch it requires) and is not recommended for production use just yet. Though we do appreciate any testing and/or feedback that you are able to provide. While not required, this module benefits from ProFields Multiplier. If you have ProFields Multiplier installed before installing this module, it will make this module more powerful by making all of your access control selectors have the ability to use OR-group conditions. Depending on your access control needs, this enables you to accomplish more with fewer Dynamic Roles. How to install Make sure you are running ProcessWire 2.4.6 (dev branch) or newer. Download from GitHub (we will add this module to the Modules directory later). Place all files from this module in /site/modules/DynamicRoles/. In your admin, go to Modules > Check for new modules. Click "install" for the Dynamic Roles module (ProcessDynamicRoles). Click to Access > Dynamic Roles for the rest (see example and instructions below). Example and instructions Lets say you ran a Skyscrapers site and wanted a role enabling users with "portmanusa.com" in their email address to have edit access to skyscrapers designed by architect John Portman, with at least 40 floors, and built on-or-after 1970. Yes, this is an incredibly contrived example, but it is an example that also demonstrates the access control potential of this module. 1. In your admin, you would click to Access > Dynamic Roles. 2. Click "Add Dynamic Role". Enter a name for the dynamic role, like: "skyscraper-test-editor" and save. 3. Under "Who is in this dynamic role?" section, click "Add Field" and choose: Email => Contains Text => "portmanusa.com". This will match all users having "portmanusa.com" in their email address. 4. Under "permissions" check the boxes for: page-view and page-edit. 5. For this contrived example, we will assume the user already has view access to all skyscrapers, so we will leave the "What can they view?" section alone. 6. For the "What can they edit?" section: Click "Add Field" and choose: template => Equals => Skyscraper. Click "Add Field" and choose: architect => Equals => John Portman. Click "Add Field" and choose: floors => Greater Than Or Equal => 40. Click "Add Field" and choose: year => Greater Than Or Equal => 1970. 7. Click Save. Now users matching the conditions of your dynamic role will be able to edit the matching pages, but not any others (unless assigned by traditional roles).13 points
-
TemplateEngineFactory The main idea of this module is to support the developer separating logic from markup. This is achieved by turning ProcessWire templates into controllers which interact over a new API variable to template engines like Smarty or Twig. The TemplateEngineFactory ships with a default engine "ProcessWire" that uses the internal TemplateFile class to render the templates (some of you may already be familiar with this concept). However, the module is constructed in a way that any template engine can be used, implemented as separate modules. Please check out the readme on GitHub for more details how it works: https://github.com/wanze/TemplateEngineFactory ... or in the modules directory: http://modules.processwire.com/modules/template-engine-factory/ Implementation of Smarty: https://github.com/wanze/TemplateEngineSmarty Implementation of Twig: https://github.com/wanze/TemplateEngineTwig Implementation of Jade (by dreerr, thanks!): https://github.com/dreerr/TemplateEngineJade How does it work? A controller (aka ProcessWire template) can have an associated template file which contains the markup to render. The folder where those templates are stored is configurable for each installed engine. If the Factory finds a template file with the same name as the controller, an instance to access the template is provided with a new API variable (called "view" by default). Over this API variable, you can set the dynamic variables that should be rendered. Hopefully the following example makes things clearer: // In controller file: /site/templates/home.php if ($input->post->form) { // Do some processing, send mail, save data... $session->redirect('./'); } // Pass variable to the template $view->set('foo', 'bar'); $view->set('show_nav', true); $view->set('nav_pages', $pages->get('/')->children()); As you can see, there is no markup echoed out. The corresponding template file is responsible for this task: // In template file: /site/templates/view/home.php <h1><?= $page->title ?></h1> <p>Foo: <?= $foo ?></p> <?php if ($show_nav): ?> <ul> <?php foreach ($nav_pages as $p): ?> <li><a href="<?= $p->url ?>"><?= $p->title ?></a></li> <?php endforeach; ?> </ul> <?php endif; ?> In the example above, "ProcessWire" is used as engine. If Smarty is the active template engine, the corresponding template file could look like this: // In template file: /site/templates/smarty/home.tpl <h1>{$page->title}</h1> <p>Foo: {$foo}</p> {if $show_nav} <ul> {foreach $nav_pages as $p} <li><a href="{$p->url}">{$p->title}</a></li> {/foreach} </ul> {/if} Note that the API variable acts as a gateway which connects you to the activated template engine. We can switch the engine behind without changing the controller logic! (I know that this is probably not a very common need, but it's a cool thing anyway ) For further information, please check out the readmes on GitHub. Please ask questions if anything makes no sense - sometimes it's hard to get my explanations Cheers10 points
-
I'm the last person to stand up for WP (seriously), but still have to point out that neither of these are really issues with WP itself. In fact most of WP problems I've seen have been related to 3rd party plugins/modules. I'm not saying that it's not the fault of the system in some way, as they really should provide a safe platform for 3rd party extensions to build on (and clearly that's not always true in the case of WP), but they (WP core developers) can't be held responsible for whatever crappy code people implement on top of the good parts of that platform. .. oh, and my main point is that this should really serve as a warning for us too: it's entirely possible, if not exactly easy, to create modules with vulnerabilities on top of ProcessWire. As the amount of modules grows, issues like this become more likely and thus we (module authors and users alike) really need to take an active role on preventing them. IMHO.8 points
-
Ok. We just launched our new website today, of course now running on ProcessWire. A long journey with many iterations and somewhat experimental. Still a work in progress, as much as never finished. There's a lot of inter-linkage going on between content news, projects and competence pages. Modules worth mentioning: TextformatterAutoLinks Markup RSS Feed http://update.ch (IE < 9 not supported, sorry. Old Androids may experience strange things)7 points
-
Here is a website I nearly finished(Still waiting for decent photos from client for gallery) for a hairdresser in Slovakia so it's all in Slovak. http://www.milujsvojevlasy.sk/ This is the first site that I used profields. I used pro fields table on the price list page: http://www.milujsvojevlasy.sk/cennik/ Using Profields table made it really nice and simple for the client to update prices in the admin. For the booking system I integrated a separate script. Used my own grid system / framework http://www.cutegrids.com to make it responsive. and of course built using the fantastic Processwire and Profields.4 points
-
Thanks Horst for bringing this up. I tried some things with using this fieldtype as config field. But it wasn't saving correctly due to it's value type of object. I made some major changes to this fieldtype. In short, the value now is handled as an array value and not as RangeSlider object anymore. See upgrade and changelog here: https://github.com/somatonic/FieldtypeRangeSlider#upgrade-notes (BTW Also renamed the module repo to FieldtypeRangeSlider) These changes now also allow for using the Inputfield as a config field in modules. Previously it wasn't possible, as the value saved wasn't treated as array. Simplest solution seemed to make the Inputfield implement InputfieldHasArrayValue. Regarding the defaultValue. This was only set and used in the Fieldtype and not Inputfield! So the defaultValue will be set to the field value. Inputfield then just deals with the value min and max. Since when using this module as a config field only, there's no fieldtype involved at all. Here just an example how to handle it as a config field. protected static $defaults = array( 'myrange' => array('min' => 10, 'max' => 90), 'myslider' => array('min' => 10) ); public static function getModuleConfigInputfields(array $data){ $data = array_merge(self::$defaults, $data); $fieldset = new InputfieldWrapper(); $modules = wire('modules'); // range with two values $field = $modules->InputfieldRangeSlider; $field->attr('name', 'myrange'); $field->attr('value', array( 'min' => $data['myrange']['min'], 'max' => $data['myrange']['max']) ); $field->isrange = true; $field->width = 90; $field->minValue = 1; // min value config $field->maxValue = 100; // max value config $field->step = 1; $field->label = 'Slider 2 range values'; $fieldset->add($field); // no range, only single value $field = $modules->InputfieldRangeSlider; $field->attr('name', 'myslider'); $field->attr('value', array( 'min' => $data['myslider']['min']) ); $field->isrange = false; $field->width = 90; $field->minValue = 1; $field->maxValue = 100; $field->step = 1; $field->label = 'Slider 1 value'; $fieldset->add($field); return $fieldset; }4 points
-
Very wise words. ProcessWire have to be careful to not become a module hell. It can easily get out of hand.4 points
-
I get that this is just a small part of a much larger issue, but as a concrete suggestion to a concrete example, there are couple of ways to achieve this: a) they've got a very sophisticated platform of their own, b) they're using one from elsewhere (such as Shopify) or c) for that price they install an out-of-the-box e-commerce solution, do minimal work on it and that's it. Not trying to be depressing here, but if an out-of-the-box solution really what the client wants and needs, that's what they should get. If you want to compete with companies like that and offer your services for clients with such needs, I'd suggest looking into existing solutions -- preferably ones provided as hosted services. If a client wants something entirely customised to their needs, I can assure you that no one can provide it for 399€. Not unless they're counting on making profit from the monthly fees in a long run, in which case the price of the project itself can be much lower than what it costs for them to build. I still very much doubt that anyone would do a >10K€ project for <500€, that's just too much of a stretch. The key here is that uniqueness, authenticity, adhering to specific requirements -- and generally speaking any work that requires involvement of a real person with real ideas -- cost. You can't get all that for couple of hundred euros. For the clients that appreciate this, a bulk product just isn't going to cut it. For those who don't, it's probably pointless to even try to sell it. Out of all the great posts on this thread already, I really liked what @yellowled said about "saving them time, effort and nerves". That's one heck of USP (as explained by @totoff) if you do (and communicate) it right. As another concrete example, we've been involved in projects that have literally cut a weeks worth of manual work to an hour or so of waiting for a background task to run. It'd be pretty hard for a client to not value that. I'm sorry that things are difficult for you and really think you're right when you say that people don't appreciate craftsmanship much these days. It's a sad thing, but all I can say is that you'll have to either find a way to provide good quality with minimal effort (out-of-the-box services) or find a way to attract clients that do appreciate this. I know that neither is really an easy way out, though.. (For the record, I work for a company that provides web-based solutions ranging from the most basic self-service platforms for small companies and individuals to entirely custom-built ones for large corporations, cities/municipalities etc. For some clients we handle everything from content to marketing and some prefer to do these things themselves. There are clients for all of our products and none of them is perfect match for all of our clients.)4 points
-
4 points
-
4 points
-
The last years Javascript has become necessary in a lot of big websites. Without Javascript, YouTube & Facebook etc. won't function. We as developer can benefit from this trend. It's rare that the average guest turns Javascript off and if they did they know. With forms I hide the forms with CSS, and show it again with Javascript. If javascript is disabled, you can show it with the <noscript> tag. Captcha brings IMOH inaccessibility to the blind or people with low vision. Even for me, with perfect eye sight I have trouble to decipher them. The reason I see is that the purpose of those websites is not to serve out information. But the main reason is marketing. Eye catching is for those companies more valuable. Do those companies even know what accessible web is or do the care enough to pay for it? Then you have those sites where developers think in front-end templates and not in structure. If you see the tabs in Bootstrap, they won't function without javascript. I think that's a sad thing. With good and structured HTML you could make tabs work with some simple :hover functionality in CSS.3 points
-
empty need.real variabble nots one come.from no public objecto.proptery empty not triggers__get or __call in objectos.stop using it u will3 points
-
Just pushed a little but important update to 2.1.3. Previously module files/folder didn't get deleted before updating a module. This would possibly would leave orphaned files that may get removed in a new module version. Now it just deletes folder and writes new folder. Fix small issue with module cache not getting updated when installing new version of a module.3 points
-
TemplateEngineSmarty This module adds Smarty as engine to the TemplateEngineFactory. Screenshot of the available configuration options: Project on GitHub: https://github.com/wanze/TemplateEngineSmarty Project in modules directory: http://modules.processwire.com/modules/template-engine-smarty/ Only Smarty related things should be discussed in this thread. For common problems/features/questions about the Factory, use the TemplateEngineFactory thread. Edit: I added a section to the readme on GitHub how I think Smarty works best in combination with the TemplateEngineFactory and ProcessWire. I used this technique in a recent project and I'm very happy with it.2 points
-
TemplateEngineTwig This module adds Twig as engine to the TemplateEngineFactory. Screenshot of the available configuration options: Project on GitHub: https://github.com/wanze/TemplateEngineTwig Project in modules directory: http://modules.processwire.com/modules/template-engine-twig/ Only Twig related things should be discussed in this thread. For common problems/features/questions about the Factory, use the TemplateEngineFactory thread.2 points
-
I've pushed an update to this module that corrects the issue with roles missing from the user selection options. Also pushed a minor core update that should correct the issue with users not showing up in the preview modal. They weren't showing up because pages in the admin were excluded, and users are pages in the admin.2 points
-
I've been thinking about a few of the points mentioned here recently. A lot of people seem to have the opinion that a website should be for free and seem to resent the fact that they have to pay much or anything at all. Sometimes I think it is because of the nature of what websites are. It is not something that can be touched or held in the hand, not a physical object. Also I think that many don't have an appreciation of the thought and time that can go into developing a site. A lot of the blame for this can be put down to free and cheap templates out there that can look quite impressive at first glance. It can be tough convincing someone to part with a lot more cash for a bespoke design especially if they are on a tight budget with so many nice looking free and cheap wordpr**s templates around. Here is an interesting article I found regarding what's wrong with cheap websites. http://joelhughes.com/2014/02/28/whats-wrong-with-a-cheap-website/ I think it makes some good points.2 points
-
Might be a stupid suggestion, but has he tried clearing session data from FF - I would think that should do it.2 points
-
Would be great to have the option to specify a page. So generate the pdf link for given page instead of the current page? So it gets more flexible2 points
-
WillyC is right Another example that does not work with magic getters: $arr = array(1,2,3); $session->arr = $arr; // Does not work! echo $session->arr[1]; // To echo out array elements, do this $arr = $session->arr; echo $arr[1];2 points
-
Yes, I understand And I think 90% doesn't need this kind of UA management, but those that do, will benefit this greatly. So hoping for eager testers, but not on live site fellows.2 points
-
I think the one of the many super cool aspects here is that this beast sits on top of the current role system. So if you have all setup, but you want to add all those users with certain criteria (like email, age, some page relation etc) view or edit something that they currently cannot, then just add this in and all just works. Without this module, those scenarios would be pretty much impossible. Hopefully many of you find this interesting. There are huge possibilities, so this is also pretty big one to test. I am sure there will be few edge cases, but Ryan has already thought many of those (like doing edits, that remove the editing rights, adding new pages and then saving it with values that are not available etc).2 points
-
You may also want to check if your client can log in on another browser or PC, before doing too much troubleshooting on the server end.2 points
-
2 points
-
PageListMigrator together with Nico's WP-importer maybe? Worked perfectly fine for me.2 points
-
d, they sell after-sale-services and the total cost of operation/ownership during the lifecycle is not transparent to the client at the time the contract is signed. the core product is just a trojan horse, a strategic offer (as it is for many hosting companies, just to name an example).2 points
-
I don't even know what to say. Domo arigato Mr. Roboto is all that comes to mind.2 points
-
OMG, perfect timing for a future project i'll be working on. Thanks Ryan and Avoine.2 points
-
Oh, this is going to come in very, very handy one day. Awesome.2 points
-
<?php // home template $session->redirect($pages->get('/')->children->first->url); // or even easier because it is already the "homepage" $session->redirect($page->children->first->url); ?>2 points
-
2 points
-
Yes, I'll build a simple pdf template which works fine so long linked and used at current page. But don't get it work as a download link from another page. But for now your way would be fine to get it work. After the module update maybe it's easier to do1 point
-
Thanks Can, I'll try it again that way. Maybe it would work the second time. First time it loads the page instead to generate and download a pdf. Would be great to set a page/ id and get a pdf download link without load the page itself.1 point
-
The site is already on the live server since days and I've created 5 users out of which one can't log in: "request aborted because it appears to be forged." Even more strange: I can log in with the users credentials and the same browsers, no problem (I'm of course at my desktop and not at my users office). The user swears that he has used the right credentials. bowser.plugn messings with session or.heis browser. is hackked1 point
-
I wonder if it is worth putting together a WP migrator profile that has everything installed ready, the right fields in place and a really, really basic template that is heavily commented? Obviously, it cannot have everything, but if it has a category layout, tags, images sorted out, a WP style pages system (as opposed to the posts) the common hanna code bits and things like fb and twitter tags all ready, the it might be very useful for those who want to get away from WP as a blog. Also needs to take into account read more and mutipage articles.1 point
-
I think there are two separate issues regarding 3rd party plugins/modules and their safety: 1. How good and well documented platform is to others to plug into? This "protip" from other of the articles was pretty confusing for me: Whaaat? is_admin() sounds like a function I could use to check if it's admin user... It of course could mean something else, like "is this page admin page" and then page like login could be admin page too... but none the less, it's confusing for sure. 2. Is there any kind of "approval" seal from official or credible party? It doesn't necessarily need to be "official", but if there is some company that I trust saying "this plugin is well coded and we didn't find any security holes from it - or the ones we found are already fixed" - then that of course adds confident towards that plugin. The first one is handled brilliantly in ProcessWire - documentation could always be more coherent, but I think most module developers get the basics pretty easily and source code is very well written and commented. And I haven't seen a module/hooking system anywhere that is better than ProcessWire's - and the API is very clean and coherent. Second one is more problematic, since security reviews require lots of time and high skills, that not many have. Currently I only use modules that I fully understand what they do and how they work. Module that does something with file uploads, logins or UA in general are of course most critical in this regard.1 point
-
Joss - this is something we should be able to handle with the Wordpress migrator - how are your galleries set up? A particular plugin? At present it handles images embedded into the WP RTE - these get imported to a PW images field and embedded back into the post. Anyway, let us know how your galleries are set up and we'll see what needs to be done to make the migrator work.1 point
-
yeah - sorry there was an error: if($count !== $total) echo "<div class='col-md-4'><ul>"; that should fix it and make it start the new column; you should be able to put back your variable logic how you want, to get the new region label; i think it's really important to comment your code, so that anyone looking at it can understand it, especially if you are posting to a forum; so commenting the logic all the way through would make it easier for us to follow what you're trying to do.. also can't guarantee this will work without being able to test it...1 point
-
1 point
-
Granted, there's a lot of truth in that statement. However, there is another perspective that small businesses can value in a CMS – the way it can make maintaining their web site easier, saving them time, effort and, well, nerves. Everyone who has worked with PW will agree that it makes it very easy to customize the backend to a specific user's needs and ability. Now, that is something most people understand very well since they have usually at some point in the past tried to build and maintain the web site themselves using, let's say, not-so-great tools like your typical “1-click web site construction kit” provided by their (cheap) web hoster. Those clients usually can be pretty impressed by how a customized backend can be way less frustrating for them and help them actally fulfill their day-to-day tasks (let's face it, for most small business clients it's more like month-to-month tasks). I have never considered myself to be an artist or something, in fact I even have my difficulties with “designer” (especially since I don't have a formal education, much less a degree in that field). I consider myself to be a craftsman. However, with small business client's, I often find that it's necessary to also act as a consultant or even advisor. As you stated, most of these clients don't know much about our craft or the tools we use – moreover, a lot of them don't even know much about the internet and marketing in it. If they do, their knowledge is outdated. I guess what I'm trying to say is what can also help is to communicate to small business clients is that what you (in addition to your craft) provide is help. (In fact, one of my clients literally refers to me as his “web site helper”.) They won't get much help and advice from any cheap chop shop selling them a generic rip-off design, and it's something some of them might be able to relate to.1 point
-
Hello @*Most Powerful Pony!*, implementing a captcha field is quite simple in PW. A captcha field basically needs to validate against a randomly generated value stored in a session. The value changes on every new captcha image generation. 1) for the matching part you can extend InputfieldText (in the same way InputfieldEmail is built) to add a string match validator, but i wouldn't bother. I use a std InputfieldText and check the value when processing the form against a session value. 2) Image / security code generation generation there are so many opensource classes you can use: - http://code.google.com/p/cool-php-captcha/ - https://github.com/Gregwar/Captcha - https://code.google.com/p/euphoric-form/source/browse/spam.php to name a few and simple to use examples what you need to do is create a new file (my-captcha-generator-file.php) which serves as image generator (it will output the raw image). In this file you include the file of your preferred captcha generator class and add a line (before the image output) to store the newly generated security code $session->captcha_code = $myCaptchaClassInstance->getTheCode(); // usually captcha generators have a method to get the generated code Now the image is sent to the browser through an img tag whose src url needs to be create by us. Basically: <img id="captcha-image" src="{image-generator-url-here}"> the {image-generator-url-here} must be a service that just return the raw image. We already have the file who outputs the raw image. To make it do that through a url I use this simple method: suppose we are building a contact form in a contact-page whose url is "/contact" !!The "contact-page" template need to have urlSegments enabled!! I will use the url /contact/captcha as the captcha generator service url in your "contact-page.php" template file check for the first segment $action = $sanitizer->name($input->urlSegment(0)); if ($action === 'captcha') { include 'my-captcha-generator-file.php'; // this output the raw image exit;// output the raw image and exit } so that your img src can be written as: <img id="captcha-image" src="<?php echo rtrim($page->url, '/'); ?>/captcha" alt=""> now you just need to process the form and check the captcha field value against $session->captcha_code Last considerations: if you want the url /contact/captcha not to be public, just check for $config->ajax and use an empty img src (or better a placeholder image) <img id="captcha-image" src="{placeholder}" alt=""> and change the source on $(document).ready(...) using a javascript ajax call. To regenerate the captcha w/o page reload using a button with html id="action-refresh-captcha": jQuery(function($) { $('#action-refresh-captcha').on('click', function(e) { var ms = (new Date()).getTime(); var src= '<?php echo rtrim($page->url, '/'); ?>/captcha?t=' + ms; $('#captcha-image').attr('src', src); e.preventDefault(); }); }); we just add a timestamp to force the browser to refresh the image src, in other words "Touching" again the captcha generator url by changing the img src html attribute will create a new security code stored in the session and the relative raw image.1 point
-
Here's a live example of the Pagination Textformatter in action at CMS Critic: http://www.cmscritic.com/how-to-create-a-social-network/ I've also updated this module to version 2, which adds an API giving you further control over pagination.1 point
-
@joss : It's just that my explanation is bad — though in your example, I don't consider B as a child of A. My issue is that I want A to list its children and B to list its own children, but A & B being on the same level in the menu. Of course I could do it with templates but I thought it would be quite messy for such a simple thing. A redirect should do the trick indeed, how could I not think about that. Thanks !1 point
-
Thanks again for testing. I should have mentioned to try on a clean install. I believe the "This page may not be deleted" message is referring to various system pages. The replace method deletes all children of the Import Parent Page before creating them again. Append or Overwrite doesn't do this. This is not an issue when migrating page trees below home, but if you choose home, then http404 and all the pages under Admin are selected, so obviously I need a check to deal with system pages that are not deleteable to prevent the error. I'll also look further into the icon_select error - I saw this a few times too - for some reason that page field is not being fully configured during the import, even though the other page fields are importing perfectly. I am glad to see the 196 pages imported though - that looks like the full set I don't really have any time for this for the next few days, but hopefully I can get these things sorted out after that.1 point
-
er ... if you were doing this by straight html, no cms, how would you do it? Surely you would still end up with a single landing page? index.html, probably. In your layout above, if A is reached by mywebsite.com, how is B reached? Would that not be mywebsite.com/B.html? In which case, as far as the visitor is concerned, B appears like a child of A, even though they are actually in the same folder. How is that different from how PW is normally?1 point
-
€1 000 for an ecommerce site is simply exploitation. I did some research a while ago on average cost of websites - can't find the same results right now (there was a nice survey), but found some others. From executionists.com: http://www.howmuchdoesawebsitecost.com/averageweb-design-pricing/ The "Web Design Calculator" of webpagefx.com gave $3 000 as the minimum price for a basic ecommerce site with nothing else, even styling. With moderate styling, standard CMS features and advanced level ecommerce the price range went to $10-21k.1 point
-
Hi there, sorry to resurrect. Brand new to PW and about to start a project where having 'save as draft' ability is necessary for team workflow. Glad to hear that it's on the roadmap for 2.5, but just want to confirm there is no published module that can perform this functionality in the meantime? Perhaps since this discussion was last updated...?1 point
-
Great penalties from both Costa Rica and Greece! What a comeback for CR after going 1 man down! Well, well, Shaheen the camel predicted this correctly....again!1 point
-
Thanks Can, glad it works for you I'm currently rewriting the module and will switch the pdf engine behind to mpdf which seems to have much better support for html. @Bacelo There are no stupid questions1 point
-
Images Manager is a fantastic and very useful module that I install on every ProcessWire site. I have a couple of sites on 2.4 and haven't experienced any problems.1 point