Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 12/21/2017 in all areas

  1. Woah! Put down your counter arguments. Now I've got your attention, hope you all have a great Christmas
    21 points
  2. Just add the disabled attribute to the button : $f = $this->modules->get('InputfieldButton'); $f->attr('disabled', 'disabled');
    4 points
  3. I'm not 100% sure if I really get what you are asking for. (?) I think it isn't possible to create another "homepage" besides the one existing, because it is a unique and single page. It is the root page and cannot have any siblings by design. It is the (root) parent of all other pages. But when I want to try out new codes in a homepage of a running site, I go into the template file of the homepage and put in a conditional like this: // on top of the homepage template file $testingOnTheOpenedHeart = true; // :) if('horst' == $user->name && $testingOnTheOpenedHeart) { // when I'm loggedIn and have set the conditional to test out something new, ... include(__DIR__ . '/_myHomeTemplate4TestingPurposes.php'); // ... include alternative file with my test code ... return; // ... and skip the following code from the original template file! } // following code // ...
    4 points
  4. hi laps, i strongly recommend using tracy during development, then you can see instantly whats going on in most of the cases... $wire->addHookAfter('Pages::saveReady', function($event) { $page = $event->arguments('page'); bd('page title: ' . $page->title); }); just put this in your /site/ready.php and save any page you like and you'll see the output in your debug bar: just put it in your /site/ready.php file - you don't need to define anything else. Prepend and append files are for rendering the frontend.
    3 points
  5. Part 1 of a 2 part Module & Service Reveal. I'm currently working on a new module: ModuleReleaseNotes that was inspired by the work I originally did on making Ryan's ProcessWireUpgrades module "release" aware. In the end, I decided to ditch the approach I was originally taking and instead work on a module that hooked in to the UpgradeConfirmation dialog and the module edit page. Aims My aims for this module are as follows... Make discovery of a module's changes prior to an upgrade a trivial task. Make breaking changes very obvious. Make reading of a module's support documentation post-install a trivial task. Make module authors start to think about how they can improve the change discovery process for their modules. Make sure the display of information from the module support files/commit messages doesn't introduce a vulnerability. Looking at these in turn... Making discovery of a module's changes prior to upgrade a trivial task. This is done by adding a "What's changed section" to the upgrade confirmation dialog. This section takes a best-effort approach to showing what's changed between the installed version and the updated version that's available via the module repository. At present, it is only able to talk to github-hosted repositories in order to ask them for the release notes, the changelog file (if present) and a list of commits between the git tag that matches the installed version and the tag matching the latest version. It will display the Release Notes (if the author is using the feature), else it will display the commits between the tags (if tagging is used by the module author) else it will show the changelog file (if present) else it will show the latest N commits on the master branch (N, of course, being configurable to your liking.) An example of the Github Release Notes pulled in for you, taken from Mike Rockett's TextformatterTypographer Module... An example of a tag-to-tag commit list from the same module... An example of a changelog - formatted to show just the changes (formatting styles will change)... Finally, an example of a fallback list of commits - sorry Adrian ... Making breaking changes obvious. This is currently done by searching for a set of configurable search strings. Later versions may be able to support breaking change detection via use of Semantic Versioning - but this may require some way of signalling the use of this versioning standard on a module-by-module basis. For now, then, you can customise the default set of change markers. Here I have added my own alias to the list of breaking change markers and the changes section of the changelog is styled accordingly (these will be improved)... Make reading of a module's support documentation, post-install, a trivial task. This is done by making some of the support files (like the README, CHANGELOG and LICENSE files) readable from the module's information/settings screen. There is an option to control the initial open/closed state of this section... Here is Tracy's README file from within the module settings page... Make module authors start to think about how they can improve the change discovery process for their modules. There are notes in each of the sections displayed on the upgrade confirmation page that help authors use each of the features... Make sure display of external information doesn't introduce a vulnerability. This is an ongoing concern, and is the thing that is most likely to delay or prevent this module's release lead to this module's withdrawl should a vulnerability be found. Currently, output is formatted either via Markdown + HTML Purifier (if it was originally a Markdown file) or via htmlspecialchars() if it has come from a plaintext file. If you discover a vulnerability, please get in contact with me via the forum PM system. Ongoing... For now, I've concentrated on integration with GitHub, as most people use that platform to host their code. I know a few people are hosting their repositories with BitBucket (PWFoo comes to mind) and some with GitLab (Mike Rockett?) and I would eventually like to have adaptor implementations for these providers (and perhaps GitKraken) - but for now, GitHub rules and the other hosts are unsupported. Links Github: ModuleReleaseNotes PW Module Repository: Here
    2 points
  6. You should have the credentials on the config.php file. From there you can for sure grab a copy easily with a tool like https://www.adminer.org/ or a small script like this https://github.com/2createStudio/shuttle-export. You don't even need that, PW is already connected with the db and can make a backup for you with this module https://modules.processwire.com/modules/process-database-backups/.
    2 points
  7. I have not checked their inner workings, but the sort in A is done at the database level (SQL) whilst the sort in B is done at an in-memoy level (PHP). Maybe this difference has a bearing on the sorted results.
    2 points
  8. I have tested with 2.7 and it works fine. Not sure about anything lower than that, but if there are any problems, I expect they would be restricted to more obscure functionality rather than the module as a whole not working.
    2 points
  9. I agree with @horst about creating a new homepage - I don't think it will be possible and certainly confusing if it was. For testing code, I am going to shamelessly promote TracyDebugger. You can use the Console panel to run any code, or if you want to test changes to the code of a particular template, use the Template editor panel which lets you "Test" the changes without actually affecting the code that is being served up to all other visitors. As for the Pages > Add New and only seeing bookmarks, that is due to your template setup - you need to read up on how to get that add new option working. The main/default way to add a new page is from the "New" action button when you mouseover the parent page in the page tree.
    2 points
  10. On the search front, I don't forget that Tracy has a built-in search that lets you choose what part of the site you want to search. It's a shortcut to that Google site search, but modified to the area you choose.
    2 points
  11. Edit: Because of the great response to this topic I wrote a guest blogpost: https://processwire.com/blog/posts/building-custom-admin-pages-with-process-modules/ One of the hidden treasures of processwire seems to be the creation of custom admin pages. Technically speaking those pages are ProcessModules - but i guess that's the reason why so many people out there seem to be afraid of building them... it sounds so hard! You've never created a module for ProcessWire? You have never created a plugin for any other CMS? You have no clue about OOP with all its classes, methods and properties? No problem! I'll show you how simple you can start: <?php class CustomAdminPage extends Process { public static function getModuleinfo() { return [ 'title' => 'Custom Admin Page Example', 'summary' => 'Minimalistic ProcessModule to show that nobody has to be afraid of building custom admin pages.', 'href' => 'https://processwire.com/talk/topic/17709-how-to-create-custom-admin-pages-aka-processmodules-yes-its-that-simple/', 'author' => 'Bernhard Baumrock, baumrock.com', 'version' => 1, // page that you want created to execute this module 'page' => [ 'name' => 'customadmin', // your page will be online at /youradmin/setup/customadmin/ 'parent' => 'setup', 'title' => 'Custom Admin Page Example' ], ]; } public function ___execute() { return 'This is the most simple Admin-Page you have ever seen :)'; } } Now save this file as CustomAdminPage.module and place it in your /site/modules folder. After a refresh it will show your module in the modules manager of your site where you can install it: After installation you already have your first very own admin page! Congratulations! Was not too hard, was it? It's as simple as that! Now lets add some more custom HTML. And to show you another nice feature we will add this code to a separate method called executeDemo(). And because everything is so simple we will also add some javascript to this page public function ___executeDemo() { $out = ''; $out .= '<h1>H1 has some special css styling in the admin, thats why it seems to have no effect</h1>'; $out .= '<h2>H2 looks different ;)</h2>'; $out .= '<h3>...and so does H3</h3>'; $out .= '<button onclick="myFunction()">Click me</button>'; $out .= '<script>function myFunction() { alert("this is a demo javascript"); }</script>'; return $out; return ''; } Now thanks to ProcessWire-magic your page will already have its own URL: Just append /demo to your url and see what you get: And of course don't forget to click the button Ok, now that code looks a bit hacky, right? Inputfields and especially InputfieldMarkup for the win! We add another method with some advanced code. To use inputfields we need a form that holds all those inputfields and that makes it possible to handle user input lateron. See somas great tutorial about forms here for a quickstart and more details: public function ___executeAdvanced() { $out = '<h2>A more complex Example</h2>'; $form = wire()->modules->get('InputfieldForm'); $field = wire()->modules->get('InputfieldMarkup'); $field->label = 'Markup Test 1'; $field->value = '<h1>h1</h1><h2>h2</h2><h3>h3</h3><h4>h4</h4>'; $form->add($field); $out .= $form->render(); return $out; } Ok, it get's boring Let's do something more fun and add a chart in a second field and change the fields to 50% screen width (I'm sure you know that already from the GUI template editor)! public function ___executeAdvanced() { $out = '<h2>A more complex Example</h2>'; $form = wire()->modules->get('InputfieldForm'); $field = wire()->modules->get('InputfieldMarkup'); $field->label = 'Markup Test 1'; $field->value = '<h1>h1</h1><h2>h2</h2><h3>h3</h3><h4>h4</h4>'; $field->columnWidth = 50; $form->add($field); $field = wire()->modules->get('InputfieldMarkup'); $field->label = 'Chart Sample'; $field->value = '$chart'; //$field->notes = 'Example code taken from here: http://www.chartjs.org/docs/latest/getting-started/usage.html'; $field->columnWidth = 50; $form->add($field); $out .= $form->render(); return $out; } OK, we are almost there... we only need to add the chart library! To keep everything clean we will put the code for the chart in another method. We will make that method PRIVATE to add some security. Our new Method: private function renderChart() { // prepare chart code wire()->config->scripts->add('https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.1.3/Chart.min.js'); ob_start(); ?> <canvas id="myChart"></canvas> <script> var ctx = document.getElementById("myChart"); var myChart = new Chart(ctx, { type: 'bar', data: { labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"], datasets: [{ label: '# of Votes', data: [12, 19, 3, 5, 2, 3], backgroundColor: [ 'rgba(255, 99, 132, 0.2)', 'rgba(54, 162, 235, 0.2)', 'rgba(255, 206, 86, 0.2)', 'rgba(75, 192, 192, 0.2)', 'rgba(153, 102, 255, 0.2)', 'rgba(255, 159, 64, 0.2)' ], borderColor: [ 'rgba(255,99,132,1)', 'rgba(54, 162, 235, 1)', 'rgba(255, 206, 86, 1)', 'rgba(75, 192, 192, 1)', 'rgba(153, 102, 255, 1)', 'rgba(255, 159, 64, 1)' ], borderWidth: 1 }] }, options: { scales: { yAxes: [{ ticks: { beginAtZero:true } }] } } }); </script> <?php return ob_get_clean(); } Now we just need to call $this->renderChart() in the right place! Here is the complete Module: <?php class CustomAdminPage extends Process { public static function getModuleinfo() { return [ 'title' => 'Custom Admin Page Example', 'summary' => 'Minimalistic ProcessModule to show that nobody has to be afraid of building custom admin pages.', 'href' => 'https://processwire.com/talk/topic/17709-how-to-create-custom-admin-pages-aka-processmodules-yes-its-that-simple/', 'author' => 'Bernhard Baumrock, baumrock.com', 'version' => 1, // page that you want created to execute this module 'page' => [ 'name' => 'customadmin', // your page will be online at /youradmin/setup/customadmin/ 'parent' => 'setup', 'title' => 'Custom Admin Page Example' ], ]; } public function ___execute() { return 'This is the most simple Admin-Page you have ever seen :)'; } public function ___executeDemo() { $out = ''; $out .= '<h1>H1 has some special css styling in the admin, thats why it seems to have no effect</h1>'; $out .= '<h2>H2 looks different ;)</h2>'; $out .= '<h3>...and so does H3</h3>'; $out .= '<button onclick="myFunction()">Click me</button>'; $out .= '<script>function myFunction() { alert("this is a demo javascript"); }</script>'; return $out; return ''; } public function ___executeAdvanced() { $out = '<h2>A more complex Example</h2>'; $form = wire()->modules->get('InputfieldForm'); $field = wire()->modules->get('InputfieldMarkup'); $field->label = 'Markup Test 1'; $field->value = '<h1>h1</h1><h2>h2</h2><h3>h3</h3><h4>h4</h4>'; $field->columnWidth = 50; $form->add($field); $field = wire()->modules->get('InputfieldMarkup'); $field->label = 'Chart Sample'; $field->value = $this->renderChart(); $field->notes = 'Example code taken from here: http://www.chartjs.org/docs/latest/getting-started/usage.html'; $field->columnWidth = 50; $form->add($field); $out .= $form->render(); return $out; } private function renderChart() { // prepare chart code wire()->config->scripts->add('https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.1.3/Chart.min.js'); ob_start(); ?> <canvas id="myChart"></canvas> <script> var ctx = document.getElementById("myChart"); var myChart = new Chart(ctx, { type: 'bar', data: { labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"], datasets: [{ label: '# of Votes', data: [12, 19, 3, 5, 2, 3], backgroundColor: [ 'rgba(255, 99, 132, 0.2)', 'rgba(54, 162, 235, 0.2)', 'rgba(255, 206, 86, 0.2)', 'rgba(75, 192, 192, 0.2)', 'rgba(153, 102, 255, 0.2)', 'rgba(255, 159, 64, 0.2)' ], borderColor: [ 'rgba(255,99,132,1)', 'rgba(54, 162, 235, 1)', 'rgba(255, 206, 86, 1)', 'rgba(75, 192, 192, 1)', 'rgba(153, 102, 255, 1)', 'rgba(255, 159, 64, 1)' ], borderWidth: 1 }] }, options: { scales: { yAxes: [{ ticks: { beginAtZero:true } }] } } }); </script> <?php return ob_get_clean(); } } I hope you enjoyed reading this and it will open up many new possibilities for you! Updates: permissions: https://processwire.com/talk/topic/17709-how-to-create-custom-admin-pages-aka-processmodules-yes-its-that-simple/?do=findComment&comment=174746 tutorial on file uploads: https://processwire.com/talk/topic/17709-how-to-create-custom-admin-pages-aka-processmodules-yes-its-that-simple/?do=findComment&comment=185261 snippet how to use NavJSON: https://processwire.com/talk/topic/17709-how-to-create-custom-admin-pages-aka-processmodules-yes-its-that-simple/?do=findComment&comment=216412
    1 point
  12. A client of mine was asking for a solution to send newsletter mails to a list of subscribers. I looked around for a module, but couldn't find any. Then I saw a screenshot on this blog post about UIKit update, and decided to recreate it. Huge thanks to @ryan for the inspiration. The module uses regular pages for building HTML content. These pages can be used to create a fallback link in emails (i.e. "Use this link if you can't view email properly"). During render it injects $page->mailerMode, which can be used to change page output between text and HTML, or to show a simplified, email only HTML output. Screenshots: Main screen is just a list of items. Create page: Module configuration page: During installation, module creates a page under admin for storing items similar to FieldtypeRepeater. It also creates some fields for storing mail info Todo: More testing Sending in batches (with a script that runs in background and real-time progress log) Plans: Integration with Mailchimp (for subscriber lists) Automation (as a separate module for creating email content pages) I'm hoping to complete and release the module in the following days. I think these features should be enough for the beginning, but I'm open to suggestions.
    1 point
  13. https://processwire.com/blog/posts/upgrades-optimizations-pw-3.0.22/#major-enhancements-to-our-password-field
    1 point
  14. @LAPS I haven't used conditional hooks. Instead, I'd have written it as: wire()->addHookAfter('Pages::saveReady', function($event) { $page = $event->arguments('page'); if ($page->template != 'user') return; $page->of(false); $page->title = $page->last_name . " " . $page->first_name; $event->return = $page; });
    1 point
  15. You could also use the "Cache" field (not installed by default) and create a "fullname" cache field to add to user template. In the field setting add the fields "first_name last_name" to save on that field. Or add a property "fullname" hook to the User page wire()-addHookProperty("User::fullname", function($event){ $event->retuen = $event->object->first_name . " " . $event->object->last_name; });
    1 point
  16. use tracy and debug $event: wire()->addHookBefore('Page(template=user)::changed(0:last_name, 1:first_name)', function($event) { bd($event); }); hookevents ($event) always have the object (class) and the arguments (parameters), in this case $event->object is the class ($page you are looking for) and ps: i prefer addHookAfter most of the time to be sure that the method itself does not overwrite the value again... don't know if that makes sense in your case but just wanted to point out that you have to take an eye on that. you see very well that $event->object = user, $event->arguments(0) = field name, (1) = old value, (2) = new value. it did only work for me like this: wire()->addHookBefore('Page(template=user)::changed(0:email)', function($event) { bd('user changed'); bd($event->arguments(0)); bd($event->arguments(1)); bd($event->arguments(2)); bd($event); }); id didn't work with multiple fields in the changed() part. don't know why. you can investigate this on your own with the help of tracy and some try&error.
    1 point
  17. the if-statement is totally fine. you can also use conditional hooks: https://processwire.com/blog/posts/new-ajax-driven-inputs-conditional-hooks-template-family-settings-and-more/#new-conditional-hooks don't think that there is a best practice or any performance difference between conditional hooks and if statements but that's just a wild guess...
    1 point
  18. By putting the code in the '/site/ready.php' file it does work. Since I need to use the hook only for my specific 'user' template pages, I could use an 'if' statement something like this: wire()->addHookBefore('Pages::saveReady', function($event) { $page = $event->arguments('page'); if ($page->template->name == 'user') { $page->title = $page->last_name . $page->first_name; } }); However, is there a way or a best practice to state the hook code somewhere so that I can explicitly indicate that the hook just run (and load) for the 'user' template, avoiding to use 'if' statements? Maybe, I want my hook to apply to all instances of a class but I am not sure how to proceed with coding and statement/file positioning. Thank you, I will give a look at Tracy debugger.
    1 point
  19. You compare === and page object to a int. if( ($pages->get($useAsRef->id)) === 10132 ) { Why do you get() the page you already have? Strange. It's not neccessary to get the page again as you have it already as $useAsRef. if($useAsRef->id == 10132) {
    1 point
  20. Not exactly a 'queue for 7 days'...but see this. We also have the module PulsewayPush that may be of interest to you ps: I have moved your topic to the General Support forums. The module's forum is only for support of existing modules (in their respective threads where possible)
    1 point
  21. Thanks @bernhard and everyone else who chimed in - I'll see what I can do about implementing this.
    1 point
  22. The easy way to do this is to compare the current JSON reply to the previous one. If an entry exists in the previous JSON reply that doesn't exist in the current JSON then you know that you need to delete the corresponding entry in PW. Storage is easy - just write the JSON to disk. Compare is easy - convert the two JSON feeds to arrays and just do an array diff. Delete is easy, as long as there is a unique field in the JSON that maps through to a unique field value in PW. Once you've processed the current deletions, just store the JSON ready for the next cycle.
    1 point
  23. Thanks @Soma - that helps. Looks like we are actually getting the same results - a miscount on my part - sorry about that! The reason of course for the extra one (now 801) is because Ryan added a new hook this morning: https://github.com/processwire/processwire/commit/87dc586c8c5d3435db8badcfbec7e9779e2b7f55#diff-bf4ce11deee917bffc99d4efcc9f72f1R2291
    1 point
  24. I thought we were working together to try to improve your Captain Hook sheet here. I guess the difference is that you can easily install Tracy, whereas I can't replicate exactly what you have at your end. That said, if you could send me a json_encode()'d version of $hooks, I can do a diff on the output you have vs what Tracy outputs. Maybe it's a bug in my script and I would like to improve it for everyone's benefit. Thanks.
    1 point
  25. I know my way around, but "expert" might be a stretch depending on what you want to do. Are you looking for Linus' clone or someone who knows how to compile source code, or somewhere in between
    1 point
  26. ... Of all hookable methods that are executed. So when you save a page you would see all methods you can hook into in the right order... Save, saveready, saved...
    1 point
  27. Thanks adrian. I've never really used the debug tools as I didn't find them really helpful. Maybe I'm missing something and just don't know how to use them properly? But what I wanted to achieve with the hookrecorder was some kind of execution plan of all hookable methods. A list where you can see which method get's called after the other. Ideally it would also show some additional information (like which page was saved, wich arguments where provided...). Maye it would also be possible to have some kind of nesting in it? The result could be something like this: ProcessPageView::execute ProcessPageView::ready ProcessPageEdit::buildForm (id=mypageid, ...) InputfieldWrapper::render (name=myfield, ...) Inputfield::render (name=myfield1, ...) Inputfield::render (name=myfield2, ...) Inputfield::render (name=myfield3, ...) ProcessPageView::finished I have no idea if that Execution Plan is correct... I'm quite familiar with hooking all around and looking for the right hook in the code but still I don't know exactly WHAT is going on WHEN. But looking on sime kind of list like above everybody would instantly get what is going on and would get a tremendously better understanding of how pw works. Then one could go further and look into the related class' code and inspect it. This list could also show additional info, as I already mentioned. And what I mean is on the one hand information about some variables what is currently happening (like which field is going to be rendered etc.) and on the other hand maybe it could list all hooks that are currently applied to this method (similar to the hooks list of the debug tools, listing hooks by priority so that you instantly get an idea of what is going on). I think such a tool would not only be of HUGE help for newbies but also for experienced devs. For example you could have a problem with some kind of pagesave actions... you have a hook that should change the page title to "myval" after every pagesave... Pages::save (id=123) execute hook from file /site/ready.php on line 12: collapsed hook code [...] $page->title = 'myval'; [...] Pages::saveReady (id=123) execute hook from file /site/modules/mymodule.module.php on line 240: [...] $page->title = 'my wrong value'; [...] Pages::saved (id=123) no hooks executed you would instantly see what's going on and that there is a conflicting saveReady hook overwriting the page title. I hope you get my point now. Or maybe I should start using XDebug and that's exactly what it is doing? PS: The list of hooks we have in the debug tools seems to be a list of all active hooks? And the sorting order is not helpful for me - it is even confusing... Is there any system in the order they are presented?
    1 point
  28. @Ivan Gretsky / @Pete, Perhaps there should be a pinned item on the Getting Started section? Only took me two and a half years lol ...
    1 point
  29. Welcome here, @pwuser1! You made the best 1st step you could - found this amazing community and one of the best php products out there (with super cool inline docs) . Start a project, solve problems as they come, read the code. This is the way PW changed me from knowing almost nothing to knowing some of it. I am sure you will become much more advanced following the same route though. Good luck! I am sure you could find tons of advice on the Internet, so not giving any generic one. But just for the count here are some links to relevant forum topics: PHP js ...but really tons of it here and elsewhere) By the way, if you want to find something on this forum (like the fact that this question was raised so many times), use special google search like this one I made for myself. Good luck!
    1 point
  30. IMHO the topic that pw is secure than other CMS is not a good strategy to promote pw itself. Drupal is one of the oldest CMS, and there are a lot of hackers around the world eager to test it. WP as well. PW is quite new in cms world and not popular yet. So if until today PW is not listed in Secunia, it doesn't mean that pw tough enough from hackers. Maybe yes maybe not ...
    1 point
  31. I updated the Cheatsheet just today to contain the latest dev.
    1 point
  32. The Benefit of Framework is standardized way of working take for example we use Processwire I know if i need to make a DB call i'd use the Processwire DB Class, that already saves us the stress of trying to understand each other's code since there's already a standard and way, now imagine you were to manage a non-framework project you'd find yourself trying to understand the way it works and also how it works. That's way framework come in, and also best practices also
    1 point
  33. Hi @Vigilante Take a look at this page to find out all available options how you can build your URL https://processwire.com/api/ref/page/url/ You can get current URL by $input->url and get current URL with query string by @input->url(true). Take a look at this https://processwire.com/api/ref/input/url/ and https://processwire.com/api/ref/input/query-string/
    1 point
  34. I can install via github clone and then create a theme quite easily, but I'm struggling with the docs in regards to uikit via npm. I've done: mkdir testproject cd testproject npm init npm install uikit --save cd node_modules/uikit npm install npm run compile Now, I'm stuck. Where do I create my theme? In the node_modules folder? Do I have to use my own build process when installing with npm? My needs are certainly a 'typical web project'. Cloning the repo explicitly says "including build scripts", implying that the build scripts are not included with npm. But they are. Running 'npm run compile' inside 'testproject/node_modules/uikit/' builds the source into the '/dist/' folder. I'm so horribly confused with the 'modern' way to make websites. Think I need to grow a neck beard and join a JS cult in order to understand all of this madness. Looking at webpack, and thinking does it replace gulp? Been reading this: https://getuikit.com/docs/webpack ...and I'm looking for the 'translate' button to turn it into English. Exasperated is an understatement of how I feel right now. I'm hoping to start learning how to create PW modules over the weekend but all this other stuff is really playing on my mind. I guess I'd like to know, how does everyone else use uikit in their PW projects? It's popular around here and I presume everyone doesn't just use the stock theme or override a few CSS variables. Any advice would be awesome. Give me a chance to grow my hair back. = edit = This helped me with the basics, getting a better idea about webpack. Still interested in hearing about how others use uikit though. https://youtu.be/lziuNMk_8eQ
    1 point
×
×
  • Create New...