Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 05/16/2024 in all areas

  1. I also like to give my clients some links to articles about PW : Article on PW by IONOS Article on PW by London web agency Net Dreams Article on PW by British web agency Presto ProcessWire vs WordPress on cmscritic.com And nice websites built with PW : Australian Antartic Program Nienburg Mittelweser Peggy Guggenheim Collection Herzzentrum Bonn Austrian Bankers Association BMW Dealersites University of Florida / IFAS Assessment and hundreds of others on this page.
    6 points
  2. And we all should put that link into our signature. Otherwise we would probably forget it again. ?
    4 points
  3. Welcome @Alpina You can also find condensed informations on this - GPT - thread (I just posted a result to start a presentation slide). @Alpina do not miss Jonathan Lahijani signature link ?
    4 points
  4. Quoting myself: Customized templates and fields Each and every content type only has the fields it really needs. Books, companies, recipes - it doesn't matter what kind of data my clients or I have to deal with. The templates and fields will reflect that. Therefore clients don't even have to learn anything in regards to creating or editing data. Super easy. It's typesafe (by my definition) We can discuss the meaning of 'typesafe' here but... I think ProcessWire is somewhat typesafe because I define each field, template, relationship, and almost everything else. I know where to expect what kind of data and know what data is allowed in which field. No guessing, no errors. (Sure this depends on your setup and your will to invest some time.) Works perfectly fine for non-developers I won't call myself a coder or programmer - I just tinker around with code and have fun. When I started using ProcessWire, getting around was super easy, and learning the fundamentals took only a day or two. From there on, it was easy-going. It's impressive what you can achieve with only some if/foreach/echo in PHP/ProcessWire. I said it a few years back and still stand behind it: ProcessWire seems to be the easiest way to learn and work with PHP. Low maintenance There are ProcessWire projects of mine that haven't been updated in the last 5+ years and still work without any PHP or security issues. The moment a project is finished and works without flaws it will do so for a very long time. There is no real need to update a project. Small footprint, high performance A ProcessWire website doesn't need that much of a big hosting package. The moment you start using Core cache functionalities or even ProCache most websites are fine and ready for an average amount of traffic. Maybe not ready for a slashdot/reddit/ProductHunt-peak but that's a totally different story. I can get so much out of ProcessWire compared to WordPress (and others I used/tested in the past). ZIP downloads and no real need for a package manager What I really love and enjoy is that you can get everything as a ZIP file, unpack those, move them around and do whatever you want or need with them. Not needing NPM or composer to get started - like in the good old days - is just perfect. In the last 1-2 years I did a lot with NPM due to 11ty and Astro, yet an old-school ZIP file has its very own charme. For comparison: Installing CraftCMS feels good and really nice, yet I absolute don't know what's happening, what is needed, and so on. It's like a blackbox. It works but I don't know why. I hate that. see thread here:
    4 points
  5. Thx to @netcarver this is now also included in RockAdminTweaks - a module intended to be a collection of all those little admin tweaks and helpers, easy to enable/disable and easy to develop, see this example (also from @netcarver). Compared to AOS, which is/was a great module, RockAdminTweaks has all tweaks separated into folders and dedicated files, so both developing new tweaks as well as maintaining existing ones should be a lot easier than with AOS (we even have a GUI for adding new tweaks...). This is what we have so far: And here the prev/next links on page edit (with nice uikit tooltips that appear instantly rather than after a delay): Contributions welcome
    4 points
  6. I wish I could write a longer reply but I'm going to be unavailable for a solid week, however check out what I wrote here (wrote it last week) which includes a lot of bullet points that you may find useful: https://github.com/jlahijani/awesome-processwire?tab=readme-ov-file#why-processwire Also welcome to the forum. You'll be in good company!
    4 points
  7. Hello everyone! I'm new to the forum and currently exploring a solution for our agency. I've had some limited experience with ProcessWire before and found it quite impressive. However, neither my colleagues nor my boss are familiar with it. I'm considering putting together a brief PowerPoint presentation for the team. Could anyone here point me to any marketing materials that could assist me in persuading my team to consider ProcessWire? Thanks in advance!
    3 points
  8. We gotta pin all of these somewhere! Maybe here: https://github.com/jlahijani/awesome-processwire ??
    3 points
  9. I don't have a link, but some bullet points of things I like about it. Clear separation between data and presentation layers (but doesn't force you into a SPA or operate as a headless CMS although you can do that with it if you want). Excellent permissions management system at both template and individual field level. Simple object model - everything is a 'page' with 'fields' - (similar to Drupal's nodes, but without the baggage). Great admin UI for no code creation of pretty much any kind of structured data. Actively developed third party migrations module (RockMigrations) that lets you mix and match visual and code based development of object definitions. Excellent third-party debugging tool, TracyDebugger Easy to learn API (I managed to understand the basics of it within half an hour - Drupal and WordPress by comparison, I was still scratching my head after quite a few hours.) Secure Fast Things people might not like about ProcessWire: You're unlikely to be able to build a website with one-click install. There are some site profiles that may suit some scenarios, but the whole point of ProcessWire is that it doesn't second guess you and force its opinions on you. ProcessWire's only area where it is somewhat opinionated is how it stores and structures data at the SQL level. Currently it only supports mySQL/MariaDB, and normally each field has its own table in the database, although ProFields modules Table, and Combo allow more traditional database table structures. It's also relatively easy to build custom fieldtype modules with their own database schemas. Version/source control: If you don't use a third party module like RockMigrations, syncing data changes between development and production with a team of developers might be complicated. (Actual output templates are no problem)
    3 points
  10. Not an exact answer, but this excellent post might give you some direction on how you can approach this conversation with your boss and collueagues in terms of business.
    3 points
  11. With the current project that I'm working on, there's eventually going to be an enormous amount of data to edit within it (in ProcessWire), and so I've been looking for ways to optimize and facilitate the editing experience. The goal is to save the people editing as much time as possible, and reduce the number of steps necessary to make common edits. This is what motivated the recent Table field updates. The is also what motivated a new module I'm working on called PageEditChildren. The PageEditChildren module takes the existing "Children" tab in ProcessWire's page editor and replaces it with a new one that lets you edit all of the child pages inline, directly from the parent page. For specific cases, such as the one shown in this video (below), this provides a more convenient way to edit multiple pages at once. It can significantly reduce the amount of back-and-forth between the page editor and the page list, or multiple page editors, keeping it all in one page editor session. Likely you would use this module to replace the "Children" tab on just some (not all) pages. Specifically, pages where the relationship between parent and children is one where they are often edited as a group. This is a fairly common use case in ProcessWire, and one where this module can save you a lot of time. From an editing standpoint, it has a lot in common with repeaters. Other modules that have some crossover are PageTable (core) when configured to create/edit children pages, and BatchChildEditor. Both use page editors in modal windows to accomplish editing children, a different approach than PageEditChildren, which keeps it all part of the single page editor. Though BatchChildEditor can edit title and status (hidden/unpublished) inline, and supports CSV export/import options, among other useful tools. All of these modules are worth consideration when there is a need to optimize the editing experience between parent and children. This is just an early preview of PageEditChildren, so I'm going to work on the module and test it out a bit more before releasing it. But it could be ready to share as soon as next week. Supporting file/image and repeater fields in this module required some minor core improvements, which are in this week's core updates. I'm interested to hear your thoughts on whether this would be useful in your sites as well? More next week. Thanks for reading and have a great weekend!
    2 points
  12. @bernhard - what do you think about compiling, minifying, and caching the css and js assets into one single file each? I just worry about how many extra requests all these tweaks will end up being. BTW - I have more AOS ones coming :)
    2 points
  13. You need to iterate over the menu items object. <?php $mainMenuItems = $mb->getMenuItems('Main navigation', 2, $options); foreach($mainMenuItems as $menu_item) { // You know have access to $menu_item->title // You know have access to $menu_item->url // See the doc for available $menu_item properties $has_children = ''; $has_children_dropdown = ''; $dropdown = ''; $tag_class = $menu_item->cssClass!=''?$menu_item->cssClass . ' ' . $has_children:$has_children; if($menu_item->isParent) { $has_children = 'has-submenu'; $has_children_dropdown = '<span uk-icon="chevron-down"></span>'; $children = $wire_pages->get($menu_item->pagesID)->children(); $dropdown = '<div uk-dropdown="animation: uk-animation-slide-top-small; duration: 300; animate-out: true; offset: 0; pos: bottom-left"><ul class="uk-nav uk-navbar-dropdown-nav">'; foreach($children as $child) { $dropdown .= '<li><a href="' . $child->url .'">'. $child->title . '</a></li>'; } $dropdown .= '</ul></div>'; } if($menu_item->pagesID == $current_page->parent->id || $menu_item->pagesID == $current_page->id) { $item = '<li class="current-item ' . $tag_class . '"><a href="' . $menu_item->url .'">'. $menu_item->title . $has_children_dropdown . '</a>' . $dropdown . '</li>'; } else { $item = '<li class="'. $tag_class .'"><a href="' . $menu_item->url .'">'. $menu_item->title . $has_children_dropdown . '</a>' . $dropdown . '</li>'; } if($menu_item->parentID == 0) { echo $item; } }
    2 points
  14. @bernhard Thanks that works great. And also thanks for the training. I am quietly learning from a book by Christian Wenz and Tobias Hauser, but some parts only become clear when I use :)
    2 points
  15. A persuasive starter-slide-presentation and key features. version: GPT 4o ? Why ProcessWire? Elevate Our Digital Projects Introduction to ProcessWire What is ProcessWire? ProcessWire is an open-source content management system (CMS) and framework. Known for its flexibility, scalability, and ease of use. Ideal for websites, applications, and digital experiences. Key Features Key Features of ProcessWire Flexibility: Create any content structure without limitations. Scalability: Suitable for small websites to large-scale applications. API First: Powerful API for developers to create custom solutions. Security: Robust security features to protect your data. Performance: Optimized for fast loading times and efficient resource usage. Benefits for Our Agency Why ProcessWire for Our Agency? Customizable Solutions: Tailor-made for client-specific requirements. Developer-Friendly: Simplifies complex projects with clean, well-documented code. User Experience: Intuitive admin interface for easy content management. Cost-Effective: Open-source nature reduces licensing costs. Success Stories with ProcessWire Case Studies Case Study 1: A multinational company improved their site performance by 40%. Case Study 2: A local business streamlined their content management process. Case Study 3: An e-commerce platform saw a 30% increase in user engagement. Community and Support Community and Support Active Community: Thousands of developers and users contributing. Extensive Documentation: Comprehensive guides and tutorials. Support Options: Community forums, professional support services. How to Get Started with ProcessWire Getting Started Installation: Easy to set up with minimal server requirements. Training: Availability of resources to get up to speed quickly. Demo: Interactive demos to explore features firsthand. Conclusion and Next Steps Conclusion and Next Steps Summary: Recap of key points about ProcessWire’s advantages. Call to Action: Schedule a workshop/demo to explore further. Contact Information: Details for further questions and support. Questions & Answers Questions & Answers Open floor for any questions from the team. Encourage discussion on how ProcessWire can meet specific needs. Notes for Presenter: Engage the Audience: Start with a brief personal anecdote about your experience with ProcessWire. Highlight Benefits: Focus on how ProcessWire can solve specific pain points your agency faces. Interactive Elements: Consider live demos or video clips showcasing ProcessWire in action. Follow-Up: Propose a follow-up meeting to discuss implementation steps. Best regards, ChatGPT (4o)
    2 points
  16. Thanks for mentioning this. It's a great module and I've been using it myself for a long time, but @tpr has moved on (last AOS commit was 4 years ago and last login was 08/2023), so I've been trying to build something that allows for a real community effort where everyone can easily contribute. We'll see how it works ?
    2 points
  17. I posted a (rather lengthy) comment about some of the ways I work with my clients. I'll be posting some of that here where reading it in context can help the message as a whole. I've been a web designer/developer for ~15 years in many capacities like freelancing, in-house employee, and now at my own one-person company (I'll get into why that's different than freelancing). I've been the new guy on the bottom rung of the ladder, and a director at an ad agency. I don't think that I'm special or that I have it all figured out! I feel this comes from a culmination of experience, long hours, mistakes, and trying my best. I'll group some topics together and give some briefs on each: on being a web professional, building value/client relations, and yeah things don't always go well. Building skills in these areas may help boost performance in things like getting clients on board with ProcessWire, differentiating yourself from other web services, being confident in what you charge, and building both a great reputation and long-term relationships. Get on the bus, we're leaving our comfort zones. Here comes the disclaimer. How and where you work matters. The market you operate in matters, competition, local economy, etc. That's why I'm not going to say "here's how to come up with what you should charge" or "this one neat trick will change the game". These are my experiences, I think some of what I share will be things you can implement yourself, some may inspire you to think of something different, and other stuff might just be rubbish. I also think that knowledge unshared is knowledge lost- so please share your critiques, experiences, and suggestions below. Your opinion and experience matters! Onward! Note- my language will tend to lean towards freelancers and individual operators but if you're a formal employee this all 100% applies to you as well. Take a moment to envision the company you work for as your client. It becomes relevant very quickly. On being a web professional Being a web dev isn't easy. Taking anything you love (going to make an assumption there) and doing it professionally means doing what you like and slapping on a bunch of stuff you don't to make it work. It also means you need to up your game in places that involve things that "orbit" web development. It is always a good idea to break focus and bring in new skills that complement and increase your expertise. This is necessary so you can be more than a really good developer- you can become an expert. An expert professional proactively learns as much as possible, they can speak with authority in many areas related to their work through verifiable fact and with consideration for others and their needs. A professional works to be good at what they do but also has skills in multiple areas that allow them to do that. It means the difference between building a website and building an effective website. A professional values: Being a clear communicator. Always #1. Being an educator Being a solution Being a student Some of those seem obvious, so let's unpack 'em. Being a clear communicator means more than speaking well. It means conveying your ideas in a way that others can understand and appreciate. It also means working to understand others because that will affect what you say next. Communication requires translating your technical knowledge into layman's terms and rather than stop at stating a fact or good idea, following up with why. This helps others value things as much as you do and shows respect for others in that you believe that they deserve to know. You are a translator you modify your attitude and approach based on how other people are engaging you by being aware and paying attention. Being an educator means bringing others in on your knowledge. Education helps avoid arguments and shows that other people deserve to know more about what you do. I told a client the other day that there are a lot of people who do technical work that don't take the time to educate those around them, that means what you're doing is just a black box of mystery to them. How can they value what you do if they don't understand it? People have become comfortable with "well I'm not smart enough to do that" or "that's too complex for me", I start with the idea that everyone is capable and it is up to them to find their limits. We aren't teaching them how to program, but we should let other people in on things they might care about. This has to be done in a way that the person you are talking to feels like they are being elevated and not become embarrassed or have feelings that they are ignorant for not knowing something. Example: A client in a meeting started reviewing the mockup and picking it apart. "I don't like the color of that button, and why is it located there? Maybe we should move X above Y. I want the form over here not at the bottom." I addressed each of their concerns. I explained that the button is located there because we know from studying user behavior that it is more likely that people will engage. The color of the button is also a UI strategy, if you look across the entire site you'll see that buttons that do something we want them to do are the same color. The "Menu" button is the same color as the "Sign Up" button, we'll have encouraged interaction by normalizing the experience and by mentally associating that color with action. The background of the call to action form at the bottom of the page is the same color as the button- because it indicates an action that you should take. Being a solution means either providing the solution, or if it isn't possible, brainstorming an alternate option. My least favorite situation is the "yes or no" decision. I try to provide a "yes or yes", where we have two options that can address a concern- even if one isn't as good as the other, or isn't what someone had in mind- you have shown that you are here and ready to work on overcoming a challenge. That makes you and your client a team. A "yes or yes" situation means that you have "become the solution", because that's how people will think about what you bring to the table. This one is worth an example from an experience I just had the other day: The client puts together events and sells tickets online. It's a reasonably large event that means a lot of people buying tickets. A lot of people were buying at the last minute, tickets sell out, and people rushing to buy may need help under pressure, both mean unhappy customers. This means a big influx of customer service requests that are difficult to handle. So: "We are trying to think of a way of how to change the shopping cart system to fix this issue but not sure how." Yes/No - "We could work on that but it may be complex work and will be a challenge to solve the problem by the next ticket date. It's up to you whether that's worth it." Yes/Yes - "Yes it's certainly possible to work on the store, we could also consider having an email sign up form on the website and then send an email when tickets go on sale, then reminders so that it can make it easier on everyone to space out the purchases and prevent last minute pressure. I'm open to both, what do you think?" I worked on a Yes/Yes solution, and they felt a lot better, and they no longer have to worry about it. I also communicated and educated by pairing my suggestion with a clear "why it's a good idea", and then I invited their input after sharing. They're signing a retainer contract with me this week. Being a student seems obvious, but it means being an effective student. We learn how to code better and try new things but it's important to get out of your box. This allows you to be more of an authority on web overall and others will see that as something they can and should trust. It's easy to study what you like, but sometimes you gotta take the classes you don't like to graduate... Here are a few: Get to know how to design websites that work. Learn UI best practices, learn about what parts of web design actually drive conversions things like speed, the number of fields on a form, effective calls to action, the difference between a web developer and a web professional is knowing how to merge what you build with what it has to accomplish. I don't do SEO services, but I have taken a lot of time to study it and understand how my work can be the absolute best when it comes to future performance. It goes beyond semantic HTML. Be familiar with what Google ranks by, the things that matter, and understand what is more important than others. It will affect the structure of the site, it means you will be doing things like creating pages that you probably wouldn't think to. Be good at technicals! Sure you've got a good looking site, but have you truly taken time to study typography? Off the top of your head, do you know what the most effective width of paragraph text on a page leads to more reading by visitors? Do you know an effective length of copy? Learn human/web psychology. How do colors affect perception? What if animations aren't just for making things pretty and cool. etc. Read and study stuff from great people like Mike Monteiro's "Design is a Job" because it will open your eyes a lot to the work you should be doing to support the work you're already doing. Also go watch his video titled "F*ck you, pay me" (spoiler: bad words) Before every project I assume that web design changed and it's up to me to check in on the latest information. Google "web design best practices 2023" before designing, head over to Stitcher.io to check out the latest that PHP has to offer and great tips- using new features may save you time, make your code ready for the future, and keep from using something that will be deprecated (WHY IS MY SITE BROKEN? YOU JUST BUILT IT!). I'm serious. Every single project. I assume my knowledge is out of date in some way. Remember: being honest and saying "you know, I'm not sure but I'll research that and get back to you" or "I'm unfamiliar but that's not something I can't figure out" is a hallmark of a trustworthy professional. Do not be a snake oil salesman, do not lie to get the job, don't be a know-it-all. Learn to defer to others who have more experience than you, for me those are SEO specialists, SEM specialists, and sometimes graphic designers. This shows respect for the work others do and you may get some partners to work with in the future. I have SEO and SEM people I trust and can recommend at the drop of a hat. This also makes you a solution, because you have others ready to help you solve problems. If you get caught BSing your way through something, you won't get away with it. Eventually they'll find out and you won't work with them again. I know people who have dropped off the map because of their arrogance or inability to be humble, you know who gets the phone call for work? Me, not him- and some of the people I work with have known him longer. Building value/client relations If you've made it this far in this ridiculously long post, you'll guess why this section comes after being a web professional. Using communication, education, solutions, and a student are pretty much the only way you can build value. Building value validates your hourly rate, or the price for a project. Those skills create intangible value, "my web person is more expensive, but they're honest, open, and always works with me to get what we need done even when I'm not sure what to do." Be mindful that if you wish you could charge more, consider starting from the basics and build more value. Keep in mind that your clients have a job. They have a business to worry about, they probably need to go pick up their kids from school, payroll is due, and why are sales down this month?! Doing your best to make their experience working with you low stress and relieve them of extra work is invaluable. To build value and establish strong client relations you have to stop thinking like a developer and start thinking like a business- PLOT TWIST: not your business, your client's business. Your work needs to reflect that this is more than a website or web application, it's going to solve problems and be a net gain for their organization. You need to think as if you had an office down the hall, act as if their deadlines matter, through the way you work with clients they should feel like worrying about a website is off the table and they can get back to what their real job is. You know what matters to you? Their profits. What else matters? Their employees effectiveness, their customer satisfaction, etc. Your website/app may highly impact all of those things (and probably will). I had a manager tell me after a presentation for a new product page on a website "I was really impressed, you think like you own a business". Mission accomplished. My response? "I really appreciate the compliment, but it really is a culmination of the work you, me, and the rest of the team have done. I really appreciate you helping move the project forward." Most of the following about initial client meetings and writing a proposal is taken from my other comment so you can skip it if you've read it already. Building value starts from the first time you talk about a website. When we first meet I work to lead the conversation in a way that gets me as much information possible to do the best work I can, to let clients know that I'm here for the "big picture", and to get them to think about what their next website means for them and how much it's worth. In my initial meeting I type a lot of notes and I always discuss the following 7 topics: This may sound odd, but what does your business do? I've looked at your current website, but would like to hear that from you. (There's a chance they haven't updated their current website due to reasons we've talked about here, or that the content doesn't do a good enough job). What are your plans over the coming year? Do you plan on expanding to new locations? New products/services? (Not always, feel the client out to see if they're positioned for this- it also lets you think about whether you need to consider this for the site architecture/code) What do you want visitors to do when they get to your website? What does success look like? Filling a form? Calling? Getting them to your online shop? Visiting your location in-person? Stick around for ad revenue? Explain that websites are supposed to do things with purpose. Open up the conversation about how a website is not a brochure, it's a live business asset that establishes brand strength, is often first impression of a business, and because we just discussed what conversions look like in the previous question- a tool that works 24/7 on their behalf. What do you like about your current site? What don't you like about your current site? Is there something that you want your website to do now that it doesn't now? Get everyone in the room to think about how this isn't a replacement website, we're leveling-up here and it's time to get strategically creative. You'll see that all requires communication, education, solutions, and a being a student. After this, I talk about my values and what is important to me when working with clients. Think about the typical idea that "programmers are hard to work with" or "the IT guy is a jerk and is abrasive". We need to overcome that with new potential clients because it's safe to assume that they've had some not-great experiences. I talk with them about these things that matter most to me: Communication. Always #1. They already know that I've taking the time to communicate, now they know that it's my priority and it makes them realize how much we've been talking about them. This is another thing that I can almost guarantee has not been said to them. Ownership. Businesses/people should own their properties and assets. True ownership means being able to use and update it. If there are services along the way (like maybe Google Tag Manager) or a new hosting company then it should be an account their business owns and I'll guide them through any process to do so. If I were to be unavailable someday- you won't be stuck with a website that was dependent on me. Performance. Re-iterating the need to aim for conversions. Adhering to accessibility rules for legal and user friendliness reasons. Making the site 100% (like Google Lighthouse 100%) SEO ready when it comes time for a specialist to optimize. These questions almost never fail to get potential clients to go wide-open with you. Every single thing we have talked about has now built value and price follows value. This is where we end the first meeting and I tell them that I want to review my notes and put a proposal (I never call it a "quote") together for them and that we can meet/call next. This first meeting usually ends up taking 1-1.5 hours, an initial meeting I had last week took 2. My proposals run 2+ pages. The opening paragraph is the introduction to the project and the approach- if they said they want to expand then the website "will be built with your goals for expansion in mind". The next are bullet points that now re-iterate much of what we talked about in our initial meeting (the 7 questions). Next I talk about timing, to head off "how long will it take"- that this project is a collaboration where we depend on each other to get content, approve designs, consider the features that the website is going to have, etc. We're all in this together, and I am invested in this with them. You're now thinking about their concerns before their questions and you've worked to control that conversation. If I'm asked for more detail, I say that we will set timelines for each stage when we get started- so when design starts the timeline is X, when that is approved we set the next timeline, etc. Then comes the price but I close with the terms of payment. It's usually 40% to get started, 40% on design approval when we go to code, and 20% on launch. Now the client is looking at the price in terms of affordability over the coming X amount of time. Here's what this process has done: my language says "I'm an agency" not "a person who does websites". The client has probably talked to me more than they ever have to other web people. They've shared the good and bad, we have a relationship, and now you have absolutely everything you need to do your best work and they know that. They probably also haven't encountered someone who wants the website to achieve conversions. They now know me as an expert. When you establish relationships with clients consider these items: Don't talk about other clients too much unless you're building rapport and talking about wins before they sign a contract. After that it's like a husband talking to his wife about his girlfriend. You can break this rule if you're talking about a success they've had that you want this client to have and correlate- because you're making it about the client you're talking to. Don't let a client feel like you're too busy or rushed. If an existing or past client needs help with something and it's small- consider what's worth more to you: the money you can bill, or the value of a client relationship. Only consider this if it's small and you can afford it- there is never anything wrong with billing a client. Be selective of who you do this with, don't do it often. Don't create a pattern and expectations. If you do this, be explicitly clear in an email (document it) with something like "I took care of that issue. This on is on the house so we'll skip the bill on this one. Let me know if you need anything else!" Make sure these are small, it makes a client feel like you aren't nickle and diming them. Do not overdo this. Don't do this to win over a bad client. Keep it for your best customers. Yeah, things don't always go well If you're still reading this ridiculously long post... Sh!t happens. You miss a deadline, you got a flat tire, your dog ate your homework. You misconfigured someones DNS and took their site down. Whatever. I would argue that if something goes wrong it's almost always the best opportunity to show how good you are. The only thing that people remember more than a problem is how you handled it. Be honest about it, admit fault, own it. If it was due to an error on someone else's part, I generally try to stay tame on blame and explain what went wrong rather than who did it- unless it was a) something egregious, or b) the person that did web work for them previously. You're not trying to dunk on them (be diplomatic) but you are there to solve problems and making sure they understand why you're now working with them and the other person isn't can be positive. Did a potential client reject your proposal (surely you aren't calling them quotes, right?) Try to negotiate if you're in a position to do it. If you've built value and it really does come down to cost, then look to have the value you've built help in negotiating. Etc. Random stuff I don't send invoices, my billing platform does. Built in document emailing, automated reminders for late clients, time tracking, reporting, expense tracking, customer portals, online payments through Stripe (and others), customizable branding, etc. If you don't have one, check out InvoiceNinja. It's open-source, built on Laravel, has an API, and you know how to put stuff on a web server, right? ? Create a subdomain like billing.yourdomain.com and it's pretty much ready to go. An update email describing less progress on a project than a client may want to hear is better than saying the same thing after they had to ask because they haven't heard from you. Keep communication open and going, let them know that you are thinking about them. Consider offering web hosting to clients when you feel like it's a good fit. Easy and inexpensive, I use StatusCake to monitor all the sites I host so I know if anything goes wrong. So my hosting is "private, exclusively for my clients, and monitored 24/7" Spin up a VPS at a reputable place. For managed hosting I use Dreamhost, for unmanaged Digital Ocean. I have a Dreamhost VPS and a separate managed MySQL DB VPS It's not really an "income source", you don't have to charge much, but it pays for all of my hosting and domain fees (including for my billing platform). They're happy, I'm happy. Very convenient to work on client sites when you don't have to juggle passwords for GoDaddy or some service they've set up. Should you be a company or a freelancer? Up to you. Historically I was a freelancer, then this year I formed an LLC. You don't have to do it but there are benefits Professional image, taxes, a more formal business interaction, legal protections Shows my clients that I'm as serious about what I do for my clients as they are. Consider creating a "marketing deck" Agencies create these to display their services and offerings. They're usually tailored to a specific client, but having a general one to provide people I'm interested in working with is a great professional document. Make it look nice, you don't have to print it, just create a PDF to have and mail. What else can you do? Can you offer more services beyond websites? I provide "web services", so design/build new websites, update/maintain/optimize existing websites Offer building integrations between platforms, provide CRM work where needed if possible Analyze business practices to help optimize workflows Research and provide recommendations for software that solves problems Help manage existing platforms, and train others to use them Think about how a developer gives you the tools for analysis, problem solving, and fast learning. You may learn software faster than other people- I've offered to learn software and then teach it to people who already use it. Think about what you can do that solves a problem while at the same time lowering the bandwidth for employees at a company. This went on waaaaay longer than I thought it would but I just shared whatever came to mind. If you are interested in seeing the deck I put together for my services (and have a reputable account with a history here in the forums) PM me. I don't want to share it in the open since it contains PII. If you found any of this useful, shout out to @kongondo for encouraging me to share. Would love to hear everyone's thoughts, critiques, and suggestions! As always, I am 100% open to being wrong about things that someone else could help me be right about.
    2 points
  18. And using bcmath inline with Padloper: $price_per_item = '3.50'; $quantity = '10'; $vat_rate = '20'; // in percentage // Calculate the total price including tax $total_price_incl_tax = bcmul($price_per_item, $quantity, 2); // Calculate the total price excluding tax $divisor = bcadd('1', bcdiv($vat_rate, '100', 2), 2); $total_price_excl_tax = bcdiv($total_price_incl_tax, $divisor, 2); // Calculate the VAT amount $vat_amount = bcsub($total_price_incl_tax, $total_price_excl_tax, 2); // Output the results echo "Total Price Excluding Tax: £" . number_format($total_price_excl_tax, 2) . "\n"; echo "VAT Amount (20%): £" . number_format($vat_amount, 2) . "\n"; echo "Total Price Including Tax: £" . number_format($total_price_incl_tax, 2) . "\n"; This will output: Total Price Excluding Tax: £29.16 VAT Amount (20%): £5.84 Total Price Including Tax: £35.00 Which again is accurate and gives the true total.
    1 point
  19. Ok I've found the issue. This is due to the tax being calculated for each item then multiplied by 10 giving you the lower figure that doesn't round to £35. The more accurate way to calculate taxes for each line of items and arrive back at £35 (inline with the true product price) is to calculate the tax on the total figure for that line of items, not on one item then multiplying that. By my testing and judgment (though I'll happily be told my logic is wrong ?) is as below: $price_per_item = 3.50; $quantity = 10; $vat_rate = 20; // in percentage // Calculate the total price including tax $total_price_incl_tax = $price_per_item * $quantity; // Calculate the total price excluding tax $total_price_excl_tax = round($total_price_incl_tax / (1 + $vat_rate / 100), 2); // Calculate the VAT amount $vat_amount = round($total_price_incl_tax - $total_price_excl_tax, 2); echo "Total Price Excluding Tax: £" . number_format($total_price_excl_tax, 2) . "\n"; echo "VAT Amount (20%): £" . number_format($vat_amount, 2) . "\n"; echo "Total Price Including Tax: £" . number_format($total_price_incl_tax, 2) . "\n"; This will output: Total Price Excluding Tax: £29.17 VAT Amount (20%): £5.83 Total Price Including Tax: £35.00 Which is accurate
    1 point
  20. No worries, I have no guidelines in place so nobody can know. Once I tried to protect the main branch from PRs but then something else was not working any more (I think automated releases)... But I think with this module and if it's only about new tweaks it shouldn't matter at all where the PRs want to merge, I'm not sure, I'll try that out tomorrow ? Great input. I've thought of a new parameter like "help" or something, and maybe one for "author" to give proper credits and one for "maintainer" if that's someone else (like you or @netcarver porting over tweaks from tpr/aos). "help" would be markdown syntax and show up in a modal. author/maintainer could be icons ? I don't think that I like the idea of having tweaks spread around several repos of several people! The module is MIT, so I'm happy to maintain it for now and if something should happen anybody could take over.
    1 point
  21. You make some very good points - conditional loading of js/css in the php file does make things much easier for sure (like your superuser only example) and it would be painful to handle this any other way, so maybe keeping things as is will be fine. Sorry about the PRs to main - I didn't check if you have a dev branch. Are you OK handling the current ones as is so long as I modify the upcoming ones? I think an additional notes parameter could be useful. Perhaps also a link parameter that could automatically populate those info icons you added to a couple of tweaks within the description. Maybe also an author parameters (maybe GH username) so it's easy to keep track of who needs to be contacted for support going forward? Of course, the other approach to this would be something like what I did with AdminActions - see Robin's addon action maintained in his own repo (https://processwire.com/modules/admin-actions-replace-home/). I like the idea of separate maintenance without the need for PRs, but it would also be a pain for others to find all the tweaks, so probably a bad idea in reality.
    1 point
  22. I phrased it wrong. I can save it, but I'd rather not have my client confused ? thanks!
    1 point
  23. Thanks for the subfolders - much better for complex tweaks, especially those that require additional assets like the AOS column break I just ported over. I know about admin.less and I do use it. I guess I kinda of forgot in this context because I've been loading an admin.css via AOS for my standard tweak for so many years now.
    1 point
  24. @ryan It's not really related to the module (which looks really useful), but generally to the problem that you adress with the module, when you have to edit lots of children. With the arrows you would edit one sibling page after another, which is a different use case and for some client might be more intuitive than editing the parent page. I really liked the feature of the AOS module which is not maintained anymore, so I thought why not ask here. Sorry if it was slightly off topic. I was also not aware of @bernhards module, which seems like a really nice replacement of AOS. I just think it's such a useful feature, that it might make sense to consider it for the core.
    1 point
  25. Sorry :) I'll leave @jploch to answer that, but I think the request for these arrows is in the spirit of making editing children easier in general from the main Content view.
    1 point
  26. @ryan - the arrows after the page title in Bernhard's screenshot above is what is being referred to.
    1 point
  27. @jploch The next/previous children pages are actually all present already, so a next/prev is a matter of moving your mouse 40 pixels down or up. But it's possible I still don't understand what you mean in this particular context. I'll try to get a beta of this module ready shortly, and once you've had a look at it let me know if the next/prev that you are thinking of still applies.
    1 point
  28. Hey @kaz you can simply check for the opposite: <?php if ($global->businesshours && $page->id !== 1127): ?> <?php include('businesshours.php'); ?> <?php endif; ?> Which means if we have businesshours AND the page id is not 1127 then include ... Note that there is a difference between !== and != (and also === and ==) // Using == $var1 = "5"; $var2 = 5; if ($var1 == $var2) { echo "Equal"; // This will output "Equal" because values are the same after type juggling. } // Using === if ($var1 === $var2) { echo "Identical"; } else { echo "Not identical"; // This will output "Not identical" because types are different (string vs integer). }
    1 point
  29. Hey @adrian thx for your suggestions! Initially I didn't want that. The focus was to make it as easy as possible to create new tweaks, which meant just creating one file in the dedicated folder and that's it. But thinking about it and the number of tweaks growing it might be better to have them in folders, so please check out v1.6.0 which works as you suggested. Also we have a gui for creating new tweaks, so it's no difference in easy of use and some tweaks might ship with additional assets, so having them in a dedicated folder will definitely keep things cleaner. I don't know what this feature is and how you are using it, but yes, adding custom JS/CSS is as easy as creating a tweak and calling $this->addJS() and $this->addCSS(). For CSS we already have /site/templates/admin.less; PS: This was a quite painful update. I removed a folder while working on this update and accidently this folder was /site/modules with lots of updates to RockCommerce and RockGrid ? Shit happens. At least I was able to restore some of the work with the VSCode timeline feature... VSCode is fortunately smart enough to only TRASH folders and not delete them, so everything was still in my bin ?
    1 point
  30. I think this sounds interesting, because the user does not have to take care about it and the installation process is the same. I will take a look at how this could be done. Thanks
    1 point
  31. Hello @Juergen Thank you for your quick and complete response. Regarding the captchaimage.php file. I think we should add a couple of lines about this in the Quick Start documentation section. "During installation, you will need to write the captchaimage.php file to the root folder. You can change permissions on this folder for the time of module installation. Or write the captchaimage.php file to the root folder and allow the system to update it." Another way is to change the functionality of the module installer. Check if it is possible to write captchaimage.php to the root folder. And if it is not possible, send a message to the user: "No access to root folder. Move the file /site/modules/FrontendForms/Formelements/Captcha/captchaimage.php to the root folder yourself." Yours Andy
    1 point
  32. I have found the old post about the php file problem, if someone is interested in ? https://processwire.com/talk/topic/27401-problem-using-php-script-as-image-src-in-processwire/
    1 point
  33. Hello @Andy Thank you for your extensive feedback ?!!! I am not sure, which list you are talking about. There is the "Blacklist" of IP addresses, that should be banned in first instance. You will find this list inside the security tab. There you can delete the entries as usual. The other list is the list of entries for failed attempts (I guess you are talking about this list). This list is stored as a logfile. This logfile can be found under "Setup/logs" and has the name "Failed-attempts-frontendforms". You can delete the whole log file, but you cannot remove only a certain entry in it. I think there would not be a benefit, if you are able to delete only certain entries. Not really! The place for the captcha.php must be a place that is public reachable and the execution of files must be allowed. At the time of writing of this module, I wanted to place this file inside the assets folder. But there was a problem: The access folder is public reachable, but PHP files were not allowed at this time, because they are executable. So I put in inside the root. I can remember that there was a discussion in the forum about this restriction. I am not sure, but maybe nowadays it could be possible to use PHP files inside the assets folder (must be tested). I think your issue is it worth to think about it to place the captcha.php inside a custom folder (or inside the assets folder if it is allowed). I have taken a look inside the contactform.php file, but I have not found it ? I have deleted it inside the contact.php! But you are right - to test if a checkbox is checked, you only need to add the"required" validator". The other validation rule is not valid. This is not a validator -> it sets the checkbox to checked on form load. You can use this to mark a checkbox by default. But it should not be used in combination with the data privacy check, because the user should mark this box and it should not be marked before. ? I will try to fix the problem with the root, because this is a serious issue, but it could not be done within an afternoon. So please be patient! Thanks for all your efforts and have a nice day! Jürgen
    1 point
  34. Hey @bernhard - I am thinking of revisiting this module now that it seems to be getting some traction but have two questions before I start pulling out the key things from AOS that I need. 1) What about having subfolders for each tweak so that we don't end up with a mess of php, js, css files for multiple tweaks in the one categorizing parent folder? 2) I am also thinking about a replacement for AOS's Assets Paths > Admin CSS and Admin JS feature. Perhaps it's a simple matter of creating a custom local tweak that just calls loadCSS() and and loadJS() for all those random tiny tweaks that are small enough and don't need a specific hook (and therefore PHP file). Any thoughts? Thanks.
    1 point
  35. Umbraco: https://our.umbraco.com/ I've actually used it in the past for someone who was on Microsoft stack. It's C# ASP.Net based so different tech stack to ProcessWire, but I found it not too different in many respects, and it didn't take me long to get my head around how to make it work. Like ProcessWire it doesn't make any assumptions about how you want to structure your data or format output, and has a good permissions system built in. It also has pretty good documentation. Where I find ProcessWire easier, is with regard to updates and installing new modules. Also Umbraco Forms is way more expensive than FormBuilder. Umbraco does have an integrated editor for modifying code for templates and partials inline, so although an editor or IDE is preferable, you don't have to have one to set up an Umbraco site. I don't know how the two compare performance wise. ASP.Net Core is meant to be pretty fast. I actually do quite a bit of ASP.Net work, especially now it's cross platform and I can host on Linux, although mostly I don't use a CMS at all, as it's pretty quick to build CRUD database access and authentication with built-in libraries, and with HTMX I can easily build a fast admin UI without having to mess around with frontend frameworks.
    1 point
  36. Quick demo of the 'custom shop root page' feature. Note: The option 'Hide the parent pages and their children in the page tree' will do just that. The pages will still be visible in the frontend and in the Products Dashboard. The options 'Limited page tree actions and redirect to Padloper dashboards' will display the pages in the page tree with actions that point to the pages in their respective Padloper Dashboards. E.g. 'edit' will edit the page in Padloper. Thanks.
    1 point
  37. Just want to acknowledge that almost all of the tweaks I've contributed were originally authored by Roland (tpr) as part of AdminOnSteroids - I've just converted the main features I use over to RockAdminTweaks format.
    1 point
  38. @jploch - this is a feature that AOS has which I enable it on all sites - very handy indeed, as is of course BreadcrumbDropdowns.
    1 point
  39. Hello @Juergen Thanks for the quick response. Yes, this feature now is working. But I immediately have a question - how to remove some IP from this list? I am testing your module now and see what a great job you have done. I will try to help you with debugging. Another problem occurred when updating your module. Warning: copy(/var/www/htdocs/minotaur/htdocs/captchaimage.php): Failed to open stream: Permission denied in /var/www/htdocs/minotaur/htdocs/wire/core/WireFileTools.php on line 282 I have the root folder locked from writing. That's not safe. Are you sure that captchaimage.php should be in the root folder? Another small find. In example /site/modules/FrontendForms/Examples/contactform.php $accept = new \FrontendForms\InputCheckbox('accept'); $accept->setLabel('I accept the data privacy'); $accept->setRule('required')->setCustomMessage('You have to accept the data privacy'); $accept->setRule('accepted'); $form->add($accept); $accept->setRule('accepted'); Incorrect construction. You must use a different function for checked. $accept->setChecked(); Best regards. Yours Andy
    1 point
  40. Thanks to all who have reported bugs so far. These are: Side menu icon not showing: I don't have a fix for this yet but a work around. Please go to /your-processwire-admin/shop/general-settings/. Have a look at the settings under User Interface, select your option then save. If you select any with the 'dropdown menu', you will need a couple of module refresh + logout + login. Error: calling get() on null errors in relation to discounts: This will happen in case you don't have discounts feature installed. The errors are now fixed. If you downloaded Padloper before yesterday, please download again, thanks. Version stays at 009. CSS issues: White on white text as mentioned above. These are not related to Padloper but my site. I am working on a fix. Confirmation emails not arriving after you complete your order: These are not related to Padloper but my shop. I am working on a fix on my server, etc. Language page names not getting changed when their titles change: When you edit any Padloper page and change the title (including variants), the names of the pages should also change. I am investigating. Thanks.
    1 point
  41. Hi, honestly for this kind of thing i use one of those two modules ? https://processwire.com/search/?q=runtime&t=Modules Robin's one is a little more recent but both work fine have a nice day
    1 point
  42. Hello @Flashmaster82 You have only added the required Validator. There are a lot of examples inside the examples folder how to validate an email address (fe at the contact forms). In this folder you will also find a special file with a lot of validation examples: https://github.com/juergenweb/FrontendForms/blob/main/Examples/field-validation.php. This file contains examples of (nearly) all possible validators and how to add them to an input field. There are 2 special validators for validation of an email, which are interesting for you: Validate email address (This is what you are asking for) Validate if email address exists (This checks for an active DNS record) In the next steps I will show you 3 possibilities (option) how to validate an email field. Option 1: Add the additional email validators to your code example // Email $email = new \FrontendForms\InputText('scf_email'); $email->setLabel($fields->get('scf_email')->$label); $email->setRule('required'); $email->setRule('email'); // checks for the right syntax of the email $email->setRule('emailDNS'); // optional: checks if the email has a valid DNS record $form->add($email); This works, but it is not the recommended way for emails. You have used an InputText input field, but for emails there is a special input field, which includes the mentioned validators by default: InputEmail Option 2: Instead of using InputText, it is better to use InputEmail, which includes email valdiation by default // Email $email = new \FrontendForms\InputEmail('scf_email'); // make usage of InputEmail $email->setLabel($fields->get('scf_email')->$label); $email->setRule('required'); $form->add($email); As the last option, I want to show you a pre-defined email input. To simplify life, I have created pre-defined input field types for the most used form fields, like surename, lastname, email, message and so on. You will find all this pre-defined fields inside the defaulf folder. These default fields includes validators and labels for these inputfields and the code is very short. Option 3: This code includes all email validators and the pre-defined email label - it is the shortest version. // Email $email = new \FrontendForms\Email('scf_email'); $email->setRule('required'); $form->add($email); Now you have 3 options, where you can choose from. Best regards Jürgen
    1 point
  43. As a security feature ProcessWire's .htaccess file blocks access to any PHP files in assets directory: https://github.com/processwire/processwire/blob/master/htaccess.txt#L383:L384. And there's also a separate (fallback) .htaccess file in /site/ or /site/assets/, which does the same. If you want to provide direct access to a .php file, you'll have to... poke a hole in these rules on your own site (you could do that by creating a .htaccess file that you put on a specific folder, in which you specifically allow access to the file you know to be safe), or route the request via ProcessWire, or put it into a directory that is not protected in this way (such as root path).
    1 point
×
×
  • Create New...