Jump to content

Wireframe


teppo

Recommended Posts

9 hours ago, adrian said:

@teppo - that looks to have fixed that issue. Something else I have just noticed is this when viewing the Wirefame module settings, although this probably isn't PHP 8 related.

image.thumb.png.85362985d3b7da762a68dc9234ad0590.png

Thanks — this is now fixed as well 🙂

  • Like 1
Link to comment
Share on other sites

  • 1 month later...

Good day, @teppo!

There is a rather empty Patterns and practices section in the docs. I got a suggestion for what to put there. Or should it be in examples? Anyway...

Could you describe how does the template with a controller handle get variables and/or url segments? I do not quite understand that, as I have no prior experience with general purpose frameworks.

  • Like 2
Link to comment
Share on other sites

  • 4 months later...

@teppo

Hi and thanks for the great tool!

Have a small issue with $persistent_cache_name in the current implementation it's not language-aware. Maybe it worth changing it to something like

$persistent_cache_name = 'Wireframe/MethodProp'
  . '/' . $context
  . '/' . static::class
  . '/' . $name
  . '/' . $this->wire('page');

if($this->wire()->modules->isInstalled("LanguageSupport")) {
  $current_language = $this->wire()->user->language;
  $default_language = $this->wire()->languages->getDefault();

  if ($current_language !== $default_language) {
    $persistent_cache_name .= . '/' . $current_language->id;
  }
}

or even move out to a separate hookable method, so we can tune names if needed. 

  • Like 1
Link to comment
Share on other sites

19 minutes ago, Mats said:

Fatal Error: Uncaught Error: Class 'Wireframe' not found in site/templates/layouts/default.php:12

That's a strange one. A couple of checks first:

  • Does your layout file include the ProcessWire namespace? If not, you'd have to call it via \ProcessWire\Wireframe (though adding namespace is always a good idea).
  • Which version of Wireframe do you have installed?

 

  • Like 1
Link to comment
Share on other sites

No, the layout did not include the ProcessWire namespace. I will try that.  

The version is 0.20.2

The namespace solved it. Was pretty sure i tested that, but must have missed it.

Thanks Teppo!

  • Like 1
Link to comment
Share on other sites

Version 0.21.0 released:

### Added
- Hookable method MethodPropsTrait::getMethodPropCacheName(string $name, string $context). Note that when hooking into this method one should refer to the object that implements the trait, such as a specific Controller class.

### Changed
- Include language ID in persistent cache name generated by MethodPropsTrait for cacheable methods.

@Zeka, thanks for bringing the lack of multi-language support for cache names up. While testing I noticed that a site I've been working on recently was in fact also affected. Not a huge deal in this case but it could've caused some confusion.

For the record: I ended up just adding the language ID to the key. If LanguageSupport is not installed it'll be a blank value, but that doesn't really matter 🙂

  • Like 2
Link to comment
Share on other sites

@teppo Thanks for the update.

I'm migrating a live site to the Wireframe and I need to set altFilename to wireframe for specific templates on the runtime via hook or somehow else only for superuser role. 

Is there is a way to do that? 

 

Link to comment
Share on other sites

To be honest I've never attempted anything like that 🙂

Just did a quick test and something along these lines might work — though I'd highly recommend testing first in a non-production environment:

if ($user->isSuperuser()) {
    $wire->addHookBefore('ProcessPageView::execute', function(HookEvent $event) {
	    foreach ($event->templates->find('name!=admin') as $template) {
            $template->filename = 'wireframe.php';
	    }
        $event->removeHook(null);
    });
}

Note: you don't want to set altFilename specifically. I'm not too familiar with how this actually works, but I just tried that, and it seems that ProcessWire is quite keen to save said value (persistently). Managed to break one of my local test sites 😛

(Based on a quick test setting filename seems less problematic.)

  • Like 1
Link to comment
Share on other sites

  • 1 month later...

I'm using the Searchengine module along with Wireframe. When trying to set the view for the ajax return it seems that the default view is called instead. When i add mark up to the default view it shows up in the json.

 if ($this->wire('config')->ajax) {
            // Respond AJAX query with JSON search results.
            $this->view->setLayout(null)->setView('json');
            header('Content-Type: application/json');
            // Return results as JSON.
            $json = $searchEngine->renderResultsJSON([
                'results_json_fields' => [
                    'title' => 'title',
                    'desc' => 'summary',
                    'url' => 'url',
                    'parent' => 'parent.title',
                    'template' => 'template.name',
                    'image' => 'pris_strl_nr_repeater.first.images.first.url',
                    'price' => 'pris_strl_nr_repeater.first.pris'
                ],
                'results_json_options' => JSON_PRETTY_PRINT,
            ]);
            return $json;

        } else {

            // Render search form and results.
            return $searchEngine->render();
        }

 

Link to comment
Share on other sites

Hey @Mats!

Just gave this a try by dropping your code into Search template controller class init method (SearchController::init()) and in my case it worked right out of the box. Where did you place the code? And, just in case, which versions of Wireframe and SearchEngine do you have installed?

In case requested view doesn't exist Wireframe should fall back to the default one (a behaviour I'm no longer entirely sure makes sense, but it's been like that since beginning, so not sure I want to change it either...) so you should also make sure that there definitely is a json.php view file for this template.

Link to comment
Share on other sites

On 7/27/2021 at 10:19 PM, Mats said:

I used the code in a search function like you do in the Wireframe docs site.

Following up on this: after taking a look at that example I've realized that... it doesn't work. Thanks for pointing this out — I should probably fix it to avoid any further confusion 😄

In this case the search method of the controller class disables layout and attempts to change the view. First one is doable (layout is rendered after the view), but the second one isn't, since at this point we've already rendered the view (search method is called in the view, after all). Instead this should be done in the init method (triggered as soon as a controller class is loaded) or the render method (triggered when a page using that controller gets rendered). The distinction between init and render usually doesn't matter 🙂

  • Like 1
Link to comment
Share on other sites

Hi @teppo!

I'm trying to use Ryans Functional field on a Wireframe site like this in the home view: 

<?= __text('Email') ?>

But i get an error:

#0 wire/core/TemplateFile.php (327): require()
#1 site/modules/Wireframe/lib/View.php (84): TemplateFile->___render()
#2 wire/core/Wire.php (414): Wireframe\View->___render()
#3 wire/core/WireHooks.php (951): Wire->_callMethod('___render', Array)
#4 wire/core/Wire.php (485): WireHooks->runHooks(Object(Wireframe\View), 'render', Array)
#5 site/modules/Wireframe/Wireframe.module.php(799): Wire->__call('render', Array)
#6 wire/core/Wire.php (417): Wireframe->___render(Array)
#7 /Applications/MAMP/htdocs/stellankram (line 19 of site/templates/views/home/default.php)

Do you have any ideas how to get the Functional fieldtype working with Wireframe?

 

/Mats 

Link to comment
Share on other sites

Hey @Mats!

The error itself is not visible there, just the trace, but first things first: did you follow the instructions in the Functional Fields README?

Asking because I just tried this fieldtype for the first time, and was a bit confused at first: I was too hasty and jumped directly to the "using" part of the blog post, where it seemed to suggest that you can just start using __text() etc. in your template files, while in reality you'll need to create a functional field before that or the functions won't work at all. Without a field the fieldtype file won't be loaded, which also means that the functions.php file won't be loaded, and thus __text() etc. will be undefined.

Anyway, let me know if this wasn't the issue. In my quick test the fieldtype seemed to render at least, but I don't have much experience with it otherwise 🙂

Link to comment
Share on other sites

Right, here is the error: 

Fatal Error: Uncaught Error: Call to undefined function __text() in site/templates/views/home/default.php

I have created and added the field to the template.

When i call the field with $page->myfuncfield it outputs FunctionalWireData.

Link to comment
Share on other sites

2 hours ago, Mats said:

Right, here is the error: 

Fatal Error: Uncaught Error: Call to undefined function __text() in site/templates/views/home/default.php

I have created and added the field to the template.

When i call the field with $page->myfuncfield it outputs FunctionalWireData.

We can rule the missing field issue out, so next question: does your view file have the ProcessWire namespace?

If not, try adding it. Or refer to the __text() method as \ProcessWire\__text().

  • Like 1
Link to comment
Share on other sites

This solved it: \ProcessWire\__text(' Your email', 'email');

I tried to add namespace ProcessWire earlier but got an error that it had to be added at the beginning of the file. 

Thanks @teppo!

Edit: Seems like the field doesn't show up in the editor. The field (label is showing) is there but no field to edit. 

Link to comment
Share on other sites

9 hours ago, Mats said:

This solved it: \ProcessWire\__text(' Your email', 'email');

I tried to add namespace ProcessWire earlier but got an error that it had to be added at the beginning of the file.

That's a strange one, unless of course the namespace declaration wasn't the very first thing in the file, right after the first PHP open tag. It should work fine in view files — in fact I always add the namespace to view files, just in case 🙂

Calling the method via ProcessWire namespace is fine, just a bit verbose.

9 hours ago, Mats said:

Edit: Seems like the field doesn't show up in the editor. The field (label is showing) is there but no field to edit. 

My guess: you'll have to modify the "file mode" setting of the functional field, selecting your view file(s) there. By default functional fields is set to look for function calls from the template file, which means that it won't show up in the editor if it's placed in any other file, including files included/required from the template file etc.

Link to comment
Share on other sites

Actually I have exactly the same problem. Seems to be a quite new bug as it works on all old pages but I get the error message the moment I create a new one... There are ALWAYS problems with this paid modules, probably to force us to pay the access fee to this forum. As much as I loved processwire in the beginning (buying almost all pro modules) the much I started to hate it...

Link to comment
Share on other sites

  • teppo pinned this topic

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Similar Content

    • By monollonom
      PageMjmlToHtml
      Github: https://github.com/romaincazier/PageMjmlToHtml
      Modules directory: https://processwire.com/modules/page-mjml-to-html/
      A module allowing you to write your Processwire template using MJML and get a converted HTML output using MJML API.
      This is considered to be in alpha and as such needs some testing before being used in production!

      About
      Created by Mailjet, MJML is a markup language making it a breeze to create newsletters displayed consistently across all email clients.
      Write your template using MJML combined with Processwire’s API and this module will automatically convert your code into a working newsletter thanks to their free-to-use Rest API.
      Prerequisite
      For this module to work you will need to get an API key and paste it in the module’s configuration.
      Usage
      Once your credentials are validated, select the template(s) in which you’re using the MJML syntax, save and go visualize your page(s) to see if everything’s good. You will either get error/warning messages or your email properly formatted and ready-to-go.
      From there you can copy/paste the raw generated code in an external mailing service or distribute your newsletter using ProMailer.
      Features
      The MJML output is cached to avoid repetitive API calls Not cached if there are errors/warnings Cleared if the page is saved Cleared if the template file has been modified A simple (dumb?) code viewer highlights lines with errors/warnings A button is added to quickly copy the raw code of the generated newsletter Not added if the page is rendered outside of a PageView Only visible to users with the page’s edit permission A shortcut is also added under “View” in the edit page to open the raw code in a new tab Multi-languages support
      Notes
      The code viewer is only shown to superusers. If there’s an error the page will display:
      Only its title for guests Its title and a message inviting to contact the administrator for editors If you are using the markup regions output strategy, it might be best to not append files to preserve your MJML markup before calling the MJML API. This option is available in the module’s settings.
    • By Marco Ro
      Hi guys!
      I'm a bit anxious because this is the first module I present! (beta modulo) But I will finally be able to share something with the community too! :)
      This is a BETA version of the PayPal payment system called: PayPal Commerce Platform.
      It is an advanced system (Business Pro account is needed) that brings various benefits in terms of fees and above all integrates direct payment with credit/debit cards. 
      The module integrates with Padloper 0.0.2, which is the current installation I'm using.
      This system integrates the classic PayPal buy button, the alternative or local payment method and the new payment system: credit/debit cards that doesn't go through the PayPal account. It is a Stripe-style payment, it connects directly with the bank and integrates 3D security validation.
      I say that it is a BETA because this module currently only works with Sandbox account, to put it live you need to change API url manually (manually for the moment).
      Because this module is not ready for live:
      I would like to have your opinion on how I built the module (is the first one I do). I don't want to share something that is not fish but I need a comparison with someone more experienced than me, for be sure that this is the best way to code the module.
      If you want to try this I created a git, you will find all the instructions for installation and correct operation. (Git has a MIT licensed)
      https://github.com/MarcooRo/processwire-PayPal-Commerce-Platform I hope I did something that you guys can like :)
    • By monollonom
      (once again I was surprised to see a work of mine pop up in the newsletter, this time without even listing the module on PW modules website 😅. Thx @teppo !)
      FieldtypeQRCode
      Github: https://github.com/romaincazier/FieldtypeQRCode
      Modules directory: https://processwire.com/modules/fieldtype-qrcode/
      A simple fieldtype generating a QR Code from the public URL of the page, and more.
      Using the PHP library QR Code Generator by Kazuhiko Arase.

      Options
      In the field’s Details tab you can change between .gif or .svg formats. If you select .svg you will have the option to directly output the markup instead of a base64 image. SVG is the default.
      You can also change what is used to generate the QR code and even have several sources. The accepted sources (separated by a comma) are: httpUrl, editUrl, or the name of any text/URL/file/image field.
      If LanguageSupport is installed the compatible sources (httpUrl, text field, ...) will return as many QR codes as there are languages. Note however that when outputting on the front-end, only the languages visible to the user will be generated.
      Formatting
      Unformatted value
      When using $page->getUnformatted("qrcode_field") it returns an array with the following structure:
      [ [ "label" => string, // label used in the admin "qr" => string, // the qrcode image "source" => string, // the source, as defined in the configuration "text" => string // and the text used to generate the qrcode ], ... ] Formatted value
      The formatted value is an <img>/<svg> (or several right next to each other). There is no other markup.
      Should you need the same markup as in the admin you could use:
      $field = $fields->get("qrcode_field"); $field->type->markupValue($page, $field, $page->getUnformatted("qrcode_field")); But it’s a bit cumbersome, plus you need to import the FieldtypeQRCode's css/js. Best is to make your own markup using the unformatted value.
      Static QR code generator
      You can call FieldtypeQRCode::generateQRCode to generate any QR code you want. Its arguments are:
      string $text bool $svg Generate the QR code as svg instead of gif ? (default=true) bool $markup If svg, output its markup instead of a base64 ? (default=false) Hooks
      Please have a look at the source code for more details about the hookable functions.
      Examples
      $wire->addHookAfter("FieldtypeQRCode::getQRText", function($event) { $page = $event->arguments("page"); $event->return = $page->title; // or could be: $event->return = "Your custom text"; }) $wire->addHookAfter("FieldtypeQRCode::generateQRCodes", function($event) { $qrcodes = $event->return; // keep everything except the QR codes generated from editUrl foreach($qrcodes as $key => &$qrcode) { if($qrcode["source"] === "editUrl") { unset($qrcodes[$key]); } } unset($qrcode); $event->return = $qrcodes; })
    • By Sebi
      AppApiFile adds the /file endpoint to the AppApi routes definition. Makes it possible to query files via the api. 
      This module relies on the base module AppApi, which must be installed before AppApiFile can do its work.
      Features
      You can access all files that are uploaded at any ProcessWire page. Call api/file/route/in/pagetree?file=test.jpg to access a page via its route in the page tree. Alternatively you can call api/file/4242?file=test.jpg (e.g.,) to access a page by its id. The module will make sure that the page is accessible by the active user.
      The GET-param "file" defines the basename of the file which you want to get.
      The following GET-params (optional) can be used to manipulate an image:
      width height maxwidth maxheight cropX cropY Use GET-Param format=base64 to receive the file in base64 format.
    • By MarkE
      This fieldtype and inputfield bundle was built for storing measurement values within a field, rendering them in a variety of formats and converting them to other units or otherwise modifying them via the API.
      The API consists of a number of predefined functions, some of which include...
      render() for rendering the measurement object, valueAs() for converting the value to another unit value, convertTo() for converting the whole measurement object to different units, and add() and subtract() for for modifying the stored value by the value (converted as required) in another measurement. In the admin the inputfield includes a checkbox (which can be optionally disabled) for converting values on page save. For an example if a value was typed in as centimeters, the unit was changed to metres, and the page saved with this checkbox selected, said value would be automatically converted so that e.g. 170 cm becomes 1.7 m.

      A simple length field using Fieldtype Measurement and Inputfield Measurement.
      Combination units (e.g. feet and inches) are also supported.
      Please note that this module is 'proof of concept' at the moment - there are limited units available and quite a lot of code tidying to do. More units will be added shortly.
      See the GitHub at https://github.com/MetaTunes/FieldtypeMeasurement for full details and updates.
×
×
  • Create New...