Jump to content

LMD

Members
  • Posts

    68
  • Joined

Everything posted by LMD

  1. [Note to moderators: this topic is no longer about ProcessWire specifically, could it moved to the Dev Talk forum?] @Commander_Gal I think the first thing you need to do here is work out your budget. How much money do you have to spend per month/year? Your budget will determine your hosting plan. You can always expand it later. Secondly, how much experience with web development do you have? Have you ever had a website before, specifically, have you got experience running a web server? That will determine what type of hosting plan you have. For a personal project, you might be better off with shared hosting where you do not have to manage the server yourself (whether physical or virtual/cloud) - it is also cheaper. As for developing the site, you will need some sort of local webserver to build the site on your computer (I use Laragon, free and fairly easy to use/learn) and I recommend a PHP-friendly IDE (Integrated Development Environment) to code with (I use Visual Studio Code, again free and open source). That is not an easy thing to set-up. I took a look at PeerTube (https://joinpeertube.org) and noted on their home page "PeerTube platforms you visit are built, managed and moderated by their owners" -- that means you have to build and maintain a server (although the FAQ does say it can be a virtual machine, see the FAQ: Should I have a big server to run PeerTube?), and you host the videos uploaded to your instance.
  2. Hi there, TL;DR: Start by building your own personal site to learn ProcessWire/PHP, while considering all the implications of becoming a content host/publisher. Which it sounds like you're planning on anyway. It's very exciting when you have an idea for a new project isn't it? A few years ago I had a webcomic I used to run on ProcessWire. (long since archived to a static site* that never updates) and it was a such a pleasure to build on that I had the same idea to set-up my own comic hosting site using ProcessWire as the engine. I even got as far as starting to develop modules for it. Ultimately, I abandoned the idea for the following reasons: Hosting costs money. Hosting images costs more money than text. Like... a lot more. The larger and higher-quality the image, the more it costs to host, and comics tend to need high quality images. You also mention videos - are these to be hosted too, or linked via YouTube (for example)? Ok, so you could use a third-party image hosting service, but then that too will cost money if your needs grow. Also, any site that hosts user content is going to need regular backups, which will also grow in size and require safe storage. Your users won't appreciate their hard work going *poof* in the night. Technical support. Any site that has users creating and uploading content will need 24hr (or near 24hr) technical support -- not just for site maintenence, but also user support. Security. You need to ensure user data is safe and secure. Now, out of the box ProcessWire is one of the most secure CMS out there, but you still need to ensure the database and user data is secure (remember those backups? They need to be stored securely). The exact details of the hoops you need to jump through and what laws you need to comply with vary depending on where the site is hosted. Responsibility. Like it or not, you will be a publisher. You will be responsible for the content put on your site. You will need a cast-iron acceptable use policy... run it by a lawyer! You will also need to enforce it, have a reporting system etc. And how will you deal with DMCA takedown notices? Acceptable content. When it comes to what is acceptable content, will it be child-safe only? If not, how will you ensure kids can't access it? Even if it is intended to be child-safe, what safeguarding features will there be to protect kids? I looked at the above list and decided "fudge it, I'm too old for this sh*t". You, however, may reach a different conclusion, or may have thought of everything already! There is one more issue that was less applicable to me: technical starting knowledge. When I had the idea, I was already a PHP programmer of several years (before ProcessWire, I hand-build a site to publish my comic), but I get the strong impression that you are not just new to ProcessWire, but new to PHP (maybe even programming? Forgive me if not) in general. Now, as Jan suggested, building a small site first is a great way to learn - my comic is how I learned a lot of my craft. I recommend you build a site for your own personal content while you learn, and it will give you time to consider all the other things in my List of Concerns above. We will be here to help as you learn. --- * Which was super-simple to do with ProcessWire too!
  3. Thanks, that page doesn't quite answer my question, although it leads to pages that might, so I have a lot of reading to do. My main concern is that it must be really easy for my client -- they are definitely not tech savvy, so if a process is remotely tricky (e.g., just setting up an account in the first place), it's just not going to work. They have used PayPal in the past and did not like it!
  4. I have never used Stripe before, but I am wondering if it what I need for a client... Does Stripe allow sellers to charge the buyer's card when items are shipped (which could be several days/a week later) instead of immediately when an order is placed? I am not talking about invoicing. As far as the buyer is concerned the process is a regular shopping cart experience, except their card won't be charged immediately. If it doesn't, is there any UK available payment gateway that does? This is for a small-scale business with <£300 per month of online sales (they are mostly a "bricks and mortar" store). I'm asking in the PW forum, because if it does, I'll be looking to use Padloper as the shopping cart. Right now my client is locked into Woocommerce and a discontinued CC (PCI compliant!) payment processor.
  5. That, and many other reasons, is why I use one ?
  6. To use a namespaced (or non-namespaced) class inside another namespaced file, you need to add a slash ('\') before the included classes' namespace. Otherwise, it is looking for the class relative to the file's namespace. While it works -- and in this instance doesn't appear to cause issues -- removing a file's namespace negates the reason for using namespaces in the first place. Here is an ammended version of your code: <?php namespace ProcessWire; class ProcessSocial extends WireData implements Module, ConfigurableModule { public function init() { $file = __DIR__ . '/vendor/autoload.php'; if (file_exists($file)) { require_once $file; } } protected function testFeed($user){ // Note the '\' before 'GetStream' $client = new \GetStream\Stream\Client($api, $key); $feed = $client->feed('User', $user); return $feed->getActivities(); } } If you find you are calling a class a lot, then you can use a 'use' statement at the top of the file, like this example: <?php namespace ProcessWire; use \GetStream\Stream\Client; // Namespace path to the classname (inc. the classname too) class ProcessSocial extends WireData implements Module, ConfigurableModule { public function init() { $file = __DIR__ . '/vendor/autoload.php'; if (file_exists($file)) { require_once $file; } } protected function testFeed($user){ // Now you don't need to add the namespace at all here $client = new Client($api, $key); $feed = $client->feed('User', $user); return $feed->getActivities(); } } Hope that helps.
  7. Another approach I use on my local dev environment, for completely unrelated projects on different hosts, is to simply symlink the 'wire' folder. My Setup/Structure: /www <-- my localhost root (I'm using Laragon). /processwire <-- folder dedicated to ProcessWire projects. /wire <-- the ACTUAL location of the wire folder that the symlinks point to. /project_a <-- each separate project (treat this folder as the web root: http://project_a.localhost/ ) /site <-- the project's ProcessWire /site folder /wire <--- this is a SYMLINK to the /www/processwire/wire folder /.htaccess <-- the ProcessWire .htaccess file. /index.php <-- the ProcessWire index.php file. /...etc <-- any other files that you'd put in the web root of a project (robots.txt etc). /project_b <-- same folder/file structure as above When I want to update the ProcessWire version, I just download it and copy the 'wire' folder over into /www/processwire (I actually rename the old folder, copy over the new and check everything works before deleting the old folder). Adding a New Project My process for adding a new project, we'll call it 'project_c', is then: Create the project in the ProcessWire projects folder: /www/processwire/project_c Create a local url for the project (http://project_c.localhost/) and point it to the newly created folder above. In the 'project_c' folder, unpack a copy of ProcessWire (the same version as the current shared wire folder for simplicity). In the browser visit http://project_c.localhost/ and run the installer as usual (& create the DB). Once installed successfully, delete the /www/processwire/project_c/wire folder (or rename it and delete later if it all works ok) and create a symlink to the shared 'wire' folder. The advantage of this for me, is that it does away with the need for naming the site folders 'site-project_a', 'site-project_b' etc.
  8. There are probably as many ways of doing this as there are people who use ProcessWire, but this is how I would do it based on what I understand of your set-up. On the template: <?php // Just include one partial here (the HTML code in 'block-sidebar' and 'block-sidebar-settings' appears identical) include('views/blocks/block-sidebar.php'); ?> Now in "block-sidebar.php" <?php $aside = page()->aside; // first get the current page aside if ($aside === "") { // If the current page aside is empty, try and get the settings aside $aside = $pages->get('1032')->settings_aside; } ?> <?php // Only show the entire block of code if $aside is not empty (if neither the current page nor settings have content) if ($aside !== "") : ?> <div class="uk-card card-bg uk-padding-small uk-margin-small-bottom"> <h6 class="uk-margin-remove uk-text-uppercase uk-text-normal" style="letter-spacing: 1px; margin-bottom: .5rem !important;"><span uk-icon="icon: info"></span> Aktuelles</h6> <?=$aside?> </div> <?php endif; ?>
  9. I do not understand what you were trying in your examples -- I think maybe you are muddled about how $sanitizer works? All it does it return the sanitized value. All you need to do is this: $activepost = $sanitizer->selectorValue($page->title); $articles = $pages->find("template=post, cbpage2=$author, limit=2, title!=$activepost, sort=-cbdate" ); /** * OR: in case you need to use it unsanitized elsewhere */ $activepost = $page->title; // note the position of the sanitizer method $articles = $pages->find("template=post, cbpage2=$author, limit=2, title!=" . $sanitizer->selectorValue($activepost) . ", sort=-cbdate" ); /** * OR (again): if $activepost is only used in the selector, you can ditch it altogether and use $page->title directly */ $articles = $pages->find("template=post, cbpage2=$author, limit=2, title!=" . $sanitizer->selectorValue($page->title) . ", sort=-cbdate" ); */
  10. @biber No problem, we've all been there at some point.
  11. Did you remember to update your password to the new one in your ProcessWire config file (/site/config.php)?
  12. Another like for the CKEditor plugin custom folder change! Regarding the download page of the website: I suspect this may have been mentioned before, but the displayed version still appears to be stuck on 3.0.174, when we are actually on version 3.0.178.
  13. @ryan This is an excellent addition to the core. For a particular use-case I have, I am wondering if something is possible -- either something already possible I've overlooked, or as a feature request. Sometimes it is useful to have the page info when building a selector for a page reference field — so I was wondering whether it could be possible to use placeholder tokens to pass the current page being edited to the ajax request? For example, in the "Text Tags" section of the field setup, we could enter something like this for the "Ajax URL" : /find-fieldname/{page.id}/?q={q} Where "{page.id}" is replaced with the ID of the page being edited at runtime. Similar to other places in the PW admin where we can insert placeholder tokens. Then in the hook itself, we have: $wire->addHook("/find-fieldname/([0-9]{4})/", function($e) { $pageID = $e->arguments(1); // ... the rest of the code }); I'm using page ID as an example, but it could be any valid page or template variable.
  14. UPDATE 20 Apr. 2021: This issue has now been fixed. I have just encountered the exact same issue here when trying to paginate a PageArray which has autojoined fields -- without autojoin the pagination works as expected, with it getTotal() shows the wrong number. This is with the newest DEV branch version of ProcessWire: ver. 3.0.175
  15. I had a thought about findRaw from a use-case I have (a flag set on pages via $page->meta() on save). I don't know how feasable it is, but it would neat if it was possible to join the contents of 'pages_meta' onto findRaw/getRaw queries. Nothing fancy, all it would need to do is return the raw data (just like any fieldtype that gets joined) as an array indexed by meta key. $p = $pages->findRaw('template=foobar, parent=1234', ['title', 'pages_meta']); /* Would return, for example: [5678] => [ 'title' => 'The Page Title', 'pages_meta' => [ 'foo' => 'Plain String', 'bar' => '{"a":"JSON","b":"String"}' ] */
  16. I never did like October ? ! I've fixed the code.
  17. Oh my, this is excellent! A first use case I thought of was archives (eg. blogs) filtered by date: YYYY/MM/DD /** * This example merely displays back the selected date as a string, but it could be used to show date-based archives. * The following URLs are valid: * /YYYY * /YYYY/MM * /YYYY/MM/DD */ // Build basic date regex to eliminate very silly things (e.g. 2021/15/92) $dateRegexY = '(year:\d{4})'; // any four digits (could be narrowed, e.g. '(19|20)\d{2}' $dateRegexM = '(month:(0[1-9]|1[0-2]))'; // 01-09 or 10-12 $dateRegexD = '(day:(0[1-9]|[1-2][0-9]|3[0-1]))'; // 01-09, 10-29, 30-31 (will need further validation!) // Put it together $dateRegex = '/' . $dateRegexY . '(/' . $dateRegexM . '(/' . $dateRegexD . ')?)?'; $wire->addHook($dateRegex, function($event) { $date = $event->year . ($event->month ? '/' . $event->month : '') . ($event->day ? '/' . $event->day : ''); return $date; }); The possibilities are endless.
  18. Without needing to buy a Pro module (although they are excellent!), there is indeed a ProcessWire way for this. You can use $files->render()/wireRenderFile() to achieve what you want: https://processwire.com/api/ref/wire-file-tools/render/ https://processwire.com/api/ref/functions/wire-render-file/ The advantage of using this over your own functions is that it will automatically keep access to all of PW's API variables (no need to pass them in). Here is a simple example based on your use-case description: /** * In your generic template file. * Note: it assumes there is a directory under 'templates' called 'layouts' (it could be called anything). * Just create your layouts in the 'layouts' dir and name them the same as the '$item->template' names you are using. */ // Get the content of the specified layout into a variable. // This example looks for '/site/templates/layouts/name-of-template.php' (the .php extension is assumed) $pageContent = $file->render('layouts/' . $item->template); // Just echo it out wherever you need it. echo $pageContent; Read the docs on it, there is more you can do with this method/function, including passing custom variables, and some other options to make it more flexible. There is also a $files->include() method which is the same except it directly echos out the content instead of returning it to a variable.
  19. This is great, but I've encountered a possible bug, unless I'm doing something wrong. As a test I used it to create a simple site map using a recursive function -- besides the page title, I also wanted a 'headline' field, so it seemed a good candidate for an autojoin test. When I ran it, however, there were some unexpected results (missing child pages and missing page names in urls) with the autojoin feature. Here is the plaintext output from my tests (correct version first, then the incorrect version): Notes: C = hasChildren / numChildren (same result) $p = current Page object being traversed In both cases, the sort order is default (manual sort in the backend). All pages use the same template (so definitely contain the fields being autojoined). In all cases, both the 'title' and 'headline' fields were present in the output, so I omitted them below. This is the recursive function I'm using: // Called with: siteMap($pages->get(1)) function siteMap(Page $p) { $str = ''; $children = $p->children('join=title|headline'); // with autojoin // $children = $p->children(); // without autojoin foreach ($children as $c) { $str .= $c->id . " " . $c->hasChildren() . " " . $p->id . " " . $c->url . "\n"; if ($c->hasChildren()) { $str .= siteMap($c); } } return $str; } The following methods all produce the same incorrect results: $p->children('join=title|headline'); wire('pages')->find('parent='.$p.', join=title|headline'); wire('pages')->findJoin('parent='.$p, 'title,headline'); wire('pages')->findJoin('parent='.$p, ['title','headline']); Furthermore, it made no difference if I used "field" or "join" as the keyword in the selector. ProcessWire 3.0.172 (DEV) PHP 7.2.0 MySQL 5.7.19
  20. [Edit: I probably should have tagged @gebeer.] Hi, I came across a use-case today that I wondered if it would be possible to add? It would be super useful to have the option to include child pages in the "Pick from the page being edited" and also "Pick from any page" source options. Furthermore, it would really useful if, when "include child pages" is selected (for all source options), the parent page being edited itself did not need to contain an image field. My use case is the following set-up: Gallery Collection 1 <-- contains 'image reference' field, but no 'images' field of its own. Album 1 <-- contains the 'images' field for a group of related image (e.g. different view of the same object). Album 2 Album Collection 2 Album 1 Etc... The parent "collection" template has an image reference to choose an image from one of the child album templates to serve as its "cover image". It would be even cooler if, as well as specifying the images field to select from, you could also specify images having a particular tag (if tags are used). But that might be asking for the moon ? !
  21. Thanks. I will look more closely at CroppableImage.
  22. @Robin SThank you for a perfectly timed module! I have a wishlist suggestion - as well as the fixed ratios, would it be feasible/possible to also include a minimum size for the crop area? For example, a banner image (used in your own screencast demo) might have a minimum width requirement. It is easy to shrink a larger cropped area, but obviously, a smaller area can not be "embiggened" without pixelation. Maybe it could be specified along with the ratio (e.g., using a comma): Banner Image=2:1,800:400 Technically, you'd only need to specify the length of the longest side.
  23. Oh, sorry, I don't have a RepeaterMatrix field in operation anywhere at the current time.
  24. Works like a charm for me, both outside and inside repeaters. Thank you, @gebeer!
×
×
  • Create New...