Jump to content
tpr

Module: Template Latte Replace

Recommended Posts

Template Latte Replace

Latte template engine support for ProcessWire

Having wrote about this one for a few times and now here it is. The readme is not complete but should give a solid starting point.

 
Feel free to ask if something's not clear.
 

https://github.com/rolandtoth/TemplateLatteReplace

Edited by owzim
added Latte link
  • Like 11

Share this post


Link to post
Share on other sites

Thanks! Keep in mind that it requires PW 3 because of the namespace. There' no specific reason to make it PW 3 only but currently I have no time to rewrite.

Just added two global functions t() and n() to make string translations easier (v0.12).

  • Like 2

Share this post


Link to post
Share on other sites

Hi @tpr!

First of all, thank you for this module! I decide to use it instead of jade-php on my current project.

The problem is, I can't get the translations on _string.php to work.

I was getting an error when using v0.12 and i just saw that you released to 0.14. I download it, the error is gone but the translation won't appear, only the default text.

I tried directly on the .latte:

{_'text to translate'}

And setting a $view->variable on the controller. 

Any hints? What am I missing?

EDIT: I'm using the latest PW dev

Thanks!

Share this post


Link to post
Share on other sites

And setting a $view->variable on the controller

You don't need to set any variable for translation. If you need to translate string in the controller, use "_t('Text to translate').

In .latte file you can use '_', '_t'.

I tried to replicate your issue, here are the steps (tried on 3.015 and 3.017 also):

1. Added "<p>{_'Text to translate'}</p>" into "home.latte" (one underscore). Text appearead in my home page fine, untranslated.

2. Added this to "_strings.php" - mind the double underscore here:

__('Text to translate')
3. In the admin language editor I added the corresponding translation. Prevously I have selected the file "_strings.php" to translate.
etalsnart ot txeT
After that, this translated text appeared on the page. Even for the default language when setting it another value in the Language Translator.

My further bugsolving thoughts are:

  • are you sure the same string is in _strings.php and your .latte file?
  • try clearing Latte cache in module settings

Btw, just realized that _strings.php doesn't need starting php tag and comments but only listing the translations (without semicolon at the end).

  • Like 1

Share this post


Link to post
Share on other sites

Well, I installed a fresh copy of 3.0.17 and started all the steps again.

At the first moment, it didn't work, but after I changed the lines on _strings.php to 

  • _x('Text to translate', 'General');

instead of __('Text to translate'), the translations appeared! 

But I tried that on my current project and it didn't work, so I'm trying to figured it out here. I'll keep you posted.

EDIT: It worked on my project as well! I was forgetting to set the context on one string. So everything is good now!

  • Like 2

Share this post


Link to post
Share on other sites

Glad you figured it out! It's interesting why it doesn't work without the context for you. Are you sure you haven't messed up the underscores? There is one in latte files, and two in _strings.php. But I guess you checked that enough times :)

Getting string translation to work is a bit tedious at first, but once you get the hang of it it's easy. Using plurals adds another layer of complexity, even if I tried hard to make it as simple as I can :)

  • Like 1

Share this post


Link to post
Share on other sites

I checked the underscores multiple times, I really don't know what happened. 

I didn't try using plural yet, I'll let you know if I bump on any problem. :) 

Many thanks!

Share this post


Link to post
Share on other sites

You were right, "General" context was used even when it shouldn't. Currently I have no idea how to fix this but will try to come up with something. Since the translator gets only the string to translate, there is nothing to check that it was called "_()" or "_t()", not even calling debug_backtrace.

Share this post


Link to post
Share on other sites

I got it working, but the "General" context will be gone. I think it's even better this way. Will upload a new version soon, after testing the different variations a bit.

  • Like 3

Share this post


Link to post
Share on other sites

v015 is uploaded to GitHub.

Syntax for string translation in .latte files is changed to "{_'text, context, textdomain'}". In textdomain use "__()" if you need no context, and "_x()" if you do.

  • Like 2

Share this post


Link to post
Share on other sites

v015 is uploaded to GitHub.

Syntax for string translation in .latte files is changed to "{_'text, context, textdomain'}". In textdomain use "__()" if you need no context, and "_x()" if you do.

So, in my case, as I'm already using _x(), nothing do do, right? :)

Share this post


Link to post
Share on other sites

Right. Previously the readme contained a wrong syntax for latte files "_('text')", but it shouldn't need the brackets. So if your syntax is also right it would work fine. Clearing latte cache is recommended though. But you should see at once whether it works or not :)

  • Like 2

Share this post


Link to post
Share on other sites

Just upgraded it here, everything seems fine! 

Thank you!

  • Like 1

Share this post


Link to post
Share on other sites

A small contribution to the project readme:

For Sublime Text 3 (should work on 2 too):

  • Install Nette + Latte + Neon package
  • Install Smarty package
  • Set latte extension to open as smarty so you can keep the HTML code autcomplete working

Bonus: install HTML-CSS-JS Prettify package and on its preferences add latte and smarty on allowed file extensions:

"html": {
    "allowed_file_extensions": ["htm", "html", "xhtml", "shtml", "xml", "svg", "latte", "smarty"],

I submitted a pull request editing the readme to add this warning:

HTML Prettify may break lines on strings translations that have more than one word, for instance:
{_'A technical book', 'Books'}

May result in
{_'A 
technical 
book', 'Books'}

so it won't appear translated any more. You'll have to remove the line breaks manually (for now). I'll see if changing something on the package preference does the trick.

Edited by Sérgio

Share this post


Link to post
Share on other sites

Great, thanks! Just updated the readme.

I'm thinking about adding Emogrifier to the module. I have only one usecase for inlining CSS (newsletters) but I think it won't hurt having a "$view->setInlineCSS('path') or similar helper at disposal.

  • Like 1

Share this post


Link to post
Share on other sites

Great, thanks! Just updated the readme.

I'm thinking about adding Emogrifier to the module. I have only one usecase for inlining CSS (newsletters) but I think it won't hurt having a "$view->setInlineCSS('path') or similar helper at disposal.

I think Emogrifier can be handy but should it be part of the module? Why not a different module, so it can work without latte too?

  • Like 1

Share this post


Link to post
Share on other sites

This is my dilemma too. Emogrifier is easy to setup so I'm not sure if it deserves an own module. Of course I'm open to other ideas.

Share this post


Link to post
Share on other sites

Just for the info: latest Nette/Latte plugin for PhpStorm works fine - syntax highlight, autocomplete and such thing works like charm. I will update the module readme later.

  • Like 1

Share this post


Link to post
Share on other sites

v016 was uploaded today to GitHub:

  • enable setting template latte file with/without extension ($view->viewFile = 'basic-page' and $view->viewFile = 'basic-page.latte')
     
  • $view->json_encode returns JSON encoded string/markup. Possible values are true and PHP's json_encode options (eg. JSON_PRETTY_PRINT).
     
  • if "viewFile" begins with "//", $config->paths->templates and viewDir is not prepended to the view path

These updates make it easier to get Ajax results, and allow placing latte files outside templates/views directory. The latter was also possible earlier using relative paths ("../"), but now it's more flexible. Getting json output was only possible using wireRenderFile() and applying json_encode() manually, which was less convenient.

  • Like 5

Share this post


Link to post
Share on other sites

v018 is uploaded with the latest Latte version (2.4.0). There's an official way to set the default layout file so previous workarounds were removed.

  • Like 2

Share this post


Link to post
Share on other sites

Here is an example for an undocumented feature: adding macros.

Put this in 'site/ready.php' (or where you set global parameters for Latte, eg. _init.php or maybe _main.php):

$view->_addMacro['custom iff'] = array(
    'iff',	// macro name
    'if (isset(%node.word) && %node.word) { $x = %node.word;', // PHP code replacing the opening brace
    '}' // // code replacing the closing brace
);

This will add an "iff" macro which eliminates the need of duplicating "$page->title" in the example below:

<h1 n:if="$page->title">{$page->title}</h1>

So instead of writing the above you can use $x:

<h1 n:iff="$page->title">{$x}</h1>

The "iff" macro also uses "isset()" so no worries if you throw in a property that doesn't exists, it won't generate an error.

Using "$x" is arbitrary, you can set any variable name if you wish.

Of course, you can use the alternative syntax too:

{iff $page->title}
<h1>{$x}</h1>
{/iff}

See more in the official docs here on creating macros.

  • Like 2

Share this post


Link to post
Share on other sites

Glad to hear that. Twig felt me a step back after Latte but I haven't really try it in detail.

  • Like 1

Share this post


Link to post
Share on other sites

Hi,

Has anyone succeeded running Hanna Code with Latte template. I'm strugling getting them to work together. Is there  a setting to prevent latte to process Hanna Code tags ?

Thanks.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Mike Rockett
      Jumplinks for ProcessWire
      Release: 1.5.56
      Composer: rockett/jumplinks
      Jumplinks is an enhanced version of the original ProcessRedirects by Antti Peisa.
      The Process module manages your permanent and temporary redirects (we'll call these "jumplinks" from now on, unless in reference to redirects from another module), useful for when you're migrating over to ProcessWire from another system/platform. Each jumplink supports wildcards, shortening the time needed to create them.
      Unlike similar modules for other platforms, wildcards in Jumplinks are much easier to work with, as Regular Expressions are not fully exposed. Instead, parameters wrapped in curly braces are used - these are described in the documentation.
      Under Development: 2.0, to be powered by FastRoute
      As of version 1.5.0, Jumplinks requires at least ProcessWire 2.6.1 to run.
      View on GitLab
      Download via the Modules Directory
      Read the docs
      Features
      The most prominent features include:
      Basic jumplinks (from one fixed route to another) Parameter-based wildcards with "Smart" equivalents Mapping Collections (for converting ID-based routes to their named-equivalents without the need to create multiple jumplinks) Destination Selectors (for finding and redirecting to pages containing legacy location information) Timed Activation (activate and/or deactivate jumplinks at specific times) 404-Monitor (for creating jumplinks based on 404 hits) Additionally, the following features may come in handy:
      Stale jumplink management Legacy domain support for slow migrations An importer (from CSV or ProcessRedirects) Feedback & Feature Requests
      I’d love to know what you think of this module. Please provide some feedback on the module as a whole, or even regarding smaller things that make it whole. Also, please feel free to submit feature requests and their use-cases.
      Note: Features requested so far have been added to the to-do list, and will be added to 2.0, and not the current dev/master branches.
      Open Source

      Jumplinks is an open-source project, and is free to use. In fact, Jumplinks will always be open-source, and will always remain free to use. Forever. If you would like to support the development of Jumplinks, please consider making a small donation via PayPal.
      Enjoy! :)
    • By BitPoet
      As threatened in Ryan's announcement for 3.0.139, I built a little module for sliding toggles as a replacement for checkboxes. Styling of the input is CSS3 only (with all the usual caveats about older browsers), no JS necessary, and may still be a bit "rough around the edges", so to speak, since I didn't have much time for testing on different devices or brushing things up enough so I'd feel comfortable pushing it to the module directory. But here's the link to the GitHub repo for now:
      InputfieldSlideToggle
      Fieldtype and Inputfield that implements smartphone-style toggles as replacement for checkbox inputs. The visualization is CSS-only, no additional JS necessary.
      Status
      Still very alpha, use with caution!
      Features / Field Settings
      Size
      You can render the toggles in four different sizes: small, medium, large and extra large.
      Off Color
      Currently, "unchecked" toggles can be displayed either in grey (default) or red.
      On Color
      "Checked" toggles can be rendered in one of these colors: blue (default), black, green, grey, orange or red.
      Screenshots

      Some examples with checkbox label


      View all Size and Color Combinations
      Small toggles Medium toggles Big toggles Extra big toggles  









    • By Orkun
      Hi Guys
      I needed to add extended functionalities for the InputfieldDatetime Module (module is from processwire version 2.7.3) because of a Request of Customer.
      So I duplicated the module and placed it under /site/modules/.
      I have added 3 new Settings to the InputfieldDatetime Module.
      1. Day Restriction - Restrict different days based on weekdays selection (e.g. saturday, sunday) - WORKING

       
      2. Time Slots - Define Time slots based on custom Integer Value (max is 60 for 1 hour) - WORKING

       
      3. Time Range Rules per Weekday - Define a minTime and MaxTime per Weekday (e.g. Opening Hours of a Restaurant) - NOT WORKING PROPERLY

       
      The Problem
      Time Slots and Day Restriction working fine so far. But the Time Range Rules per Weekday doesn't work right.
      What should happen is, that when you click on a date, it should update the minTime and maxTime of the Time Select.
      But the change on the select only happens if you select a date 2 times or when you select a date 1 time and then close the datepicker and reopen it again.
      The time select doesn't get change when you select a date 1 time and don't close the picker.
      Here is the whole extended InputfieldDatetime Module.
      The Files that I have changed:
      InputfieldDatetime.module InputfieldDatetime.js jquery-ui-timepicker-addon.js (https://trentrichardson.com/examples/timepicker/) - updated it to the newest version, because minTime and maxTime Option was only available in the new version  
      Thats the Part of the JS that is not working correctly:
      if(datetimerules && datetimerules.length){ options.onSelect = function(date, inst) { var day = $(this).datetimepicker("getDate").getDay(); day = day.toString(); var mintime = $(this).attr('data-weekday'+day+'-mintime'); var maxtime = $(this).attr('data-weekday'+day+'-maxtime'); console.log("weekday: "+day); console.log("minTime: "+mintime); console.log("maxTime: "+maxtime); var optionsAll = $(this).datetimepicker( "option", "all" ); optionsAll.minTime = mintime; optionsAll.maxTime = maxtime; $(this).datetimepicker('destroy'); $(this).datetimepicker(optionsAll); $(this).datetimepicker('refresh'); //$.datepicker._selectDate($(this).attr("id"),date); //$.datepicker._base_getDateDatepicker(); // var inst = $.datepicker._getInst($(this)); // $.datepicker._updateDatepicker(inst); /*$(this).datetimepicker('destroy'); InputfieldDatetimeDatepicker($(this), mintime, maxtime); $(this).datetimepicker('refresh'); */ // $(this).datetimepicker('option', {minTime: mintime, maxTime: maxtime}); } } Can you have a look and find out what the Problem is?
      InputfieldDatetime.zip
       
      Kind Regards
      Orkun
    • By teppo
      This module tracks changes, additions, removals etc. of public (as in "not under admin") pages of your site. Like it's name says, it doesn't attempt to be a version control system or anything like that - just a log of what's happened.
      At the moment it's still a work in progress and will most likely be a victim of many ruthless this-won't-work-let's-try-that-instead cycles, but I believe I've nailed basic functionality well enough to post it here.. so, once again, I'll be happy to hear any comments you folks can provide
      https://modules.processwire.com/modules/process-changelog/
      https://github.com/teppokoivula/ProcessChangelog
      How does it work?
      Exactly like it's (sort of) predecessor, Process Changelog actually consists of two modules: Process Changelog and Process Changelog Hooks. Hooks module exists only to serve main module by hooking into various functions within Pages class, collecting data of performed operations, refining it and keeping up a log of events in it's own custom database table (process_changelog.) Visible part is managed by Process Changelog, which provides users a (relatively) pretty view of the contents of said log table.
      How do you use it?
      When installed this module adds new page called Changelog under Admin > Setup which provides you with a table view of collected data and basic filtering tools See attached screenshots to get a general idea about what that page should look like after a while.
      For detailed installation instructions etc. see README.md.
       


    • By Gadgetto
      Status update links (inside this thread) for SnipWire development will be always posted here:
      2019-08-08
      2019-06-15
      2019-06-02
      2019-05-25
      If you are interested, you can test the current state of development:
      https://github.com/gadgetto/SnipWire
      Please note that the software is not yet intended for use in a production system (alpha version).
      If you like, you can also submit feature requests and suggestions for improvement. I also accept pull requests.
      ---- INITIAL POST FROM 2019-05-25 ----
      I wanted to let you know that I am currently working on a new ProcessWire module that fully integrates the Snipcart Shopping Cart System into ProcessWire. (this is a customer project, so I had to postpone the development of my other module GroupMailer).
      The new module SnipWire offers full integration of the Snipcart Shopping Cart System into ProcessWire.
      Here are some highlights:
      simple setup with (optional) pre-installed templates, product fields, sample products (quasi a complete shop system to get started immediately) store dashboard with all data from the snipcart system (no change to the snipcart dashboard itself required) Integrated REST API for controlling and querying snipcart data webhooks to trigger events from Snipcart (new order, new customer, etc.) multi currency support self-defined/configurable tax rates etc. Development is already well advanced and I plan to release the module in the next 2-3 months.
      I'm not sure yet if this will be a "Pro" module or if it will be made available for free.
      I would be grateful for suggestions and hints!
      (please have a look at the screenshots to get an idea what I'm talking about)
       




×
×
  • Create New...