Jump to content
ryan

Hanna Code

Recommended Posts

It's render($field), not render([

]). So jmartsch example is little off.

Actually doesn't work. But with the fix both work.

Share this post


Link to post
Share on other sites

Thanks guys, and sorry about the bug there. The problem was actually not what was highlighted above, but this line: 

public function render($value) {
  $value = $this->formatValue(new NullPage(), new Field(), $value); // this line
  return $value; 
}
...is supposed to be this:
public function render($value) {
  $this->formatValue(new NullPage(), new Field(), $value); // this line
  return $value; 
}

The formatValue function accepts $value as reference, not a separate copy (i.e. &$value rather than $value). So the line that blanks out $this->value is intentional. The point of that is to clear the memory, ensuring the module doesn't keep a separate copy of the text, since it no longer is working with it. So if you commented that line, I would uncomment it again. Actually I'm updating the source to fix the issue now, so you can also just grab the latest version. 

  • Like 2

Share this post


Link to post
Share on other sites

Hey Ryan. Thanks for the quick fix :)

Now the PHP example works, but why can´t we use Hanna Code directly in our template files just by using [[name_of_hanna_code_snippet]]?

Are there performance issues?

  • Like 1

Share this post


Link to post
Share on other sites

Another problem.

If i set Hanna Code Text Formatter for the field body and then want to output the body field in my template via PHP, all other code from my Hanna Code snippet is overwritten. Only the field $page->body appears.

To clarify, here is what i got:

Field with the name body -> Text Formatter: Hanna Code Text Formatter

Hanna code:

!HannaCode:newsdetails:eyJuYW1lIjoibmV3c2RldGFpbHMiLCJ0eXBlIjoiMiIsImNvZGUiOiJlY2hvICRwYWdlLT50aXRsZTtcclxuXHJcblxyXG5pZigkcGFnZS0+dGh1bWJuYWlsKXtcclxuXHQkaW1hZ2UgPVwiPGEgaHJlZj0neyRwYWdlLT50aHVtYm5haWwtPnVybH0nIGNsYXNzPSdsaWdodGJveCc+XCI7XHJcblx0JGltYWdlIC49XCI8aW1nIGNsYXNzPSdwdWxsLXJpZ2h0IGltZy1wb2xhcm9pZCcgc3JjPSd7JHBhZ2UtPnRodW1ibmFpbC0+d2lkdGgoMjAwKS0+dXJsfSc+XCI7XHJcblx0XHRcdFx0XHRcL1wvICRpbWFnZSAuPVwiPGltZyBjbGFzcz0ncHVsbC1yaWdodCBpbWctcG9sYXJvaWQnIHNyYz0neyRwYWdlLT50aHVtYm5haWwtPmdldFRodW1iKHRodW1ibmFpbCl9Jz5cIjtcclxuXHQkaW1hZ2UgLj1cIjxcL2E+XCI7XHJcbn1cclxuXHJcbmVjaG8gJGltYWdlO1xyXG5lY2hvICRwYWdlLT5ib2R5O1x0In0=/!HannaCode

here is the PHP for the Hanna Code:

echo $page->title;

if($page->thumbnail){
	$image ="<a href='{$page->thumbnail->url}' class='lightbox'>";
	$image .="<img class='pull-right img-polaroid' src='{$page->thumbnail->width(200)->url}'>";
					// $image .="<img class='pull-right img-polaroid' src='{$page->thumbnail->getThumb(thumbnail)}'>";
	$image .="</a>";
}

echo $image;
echo $page->body;

template newsdetail.php

<?php
$hanna = $modules->get('TextformatterHannaCode'); 
echo $hanna->render('[[newsdetails]]');
?>

When i open the page, only the contents of the body field appear.

No Hanna Code is actually used in the body field. Just plain text!!!!

If i remove the text formatter for the body field, everything works fine.

But sometimes i want to use Hanna Code in my body field as well.

So how do i do that?

Share this post


Link to post
Share on other sites

Now the PHP example works, but why can´t we use Hanna Code directly in our template files just by using [[name_of_hanna_code_snippet]]?

Are there performance issues?

Actually you could do this by hooking $hanna->render() into Page::render. But I don't recommend it because then you always have to filter for Hanna Codes in any user input that gets echoed back to the screen. Basically, it just opens up security issues that would be potentially difficult for someone to keep track of. It's a lot safer to be specific and just render Hanna Codes in the blocks of content you intend. 

When i open the page, only the contents of the body field appear.

No Hanna Code is actually used in the body field. Just plain text!!!!

The problem I can see with your Hanna Code is that it's echoing $page->body. Your Hanna Code should only echo what actually replaces the tag. Maybe that's what you want when you do a call like $hanna->render("[[newdetails]]"); but that's definitely not what you want to be textformatting your $page->body field -- seems like that could potentially result in an infinite loop.

Share this post


Link to post
Share on other sites

I've posted an update to Hanna Code to address some of the things brought up earlier:

  • It now comes with a proper code editor (Ace Editor). You can configure the theme and editor height in the ProcessHannaCode module settings. 
  • There is now a "Save & Test" option. When you click that, it will save then attempt to run the Hanna code. This is primarily useful for determining if you have any PHP parse errors or the like. 
  • The default behavior of "Save" is now to continue editing, rather than going back to the list of Hanna codes. There is now a separate "Save & Exit" button to do that. 
  • The interface now uses tabs. 

post-2-0-18368200-1375715945_thumb.png

post-2-0-74838800-1375715954_thumb.png

post-2-0-11747200-1375715964_thumb.png

  • Like 2

Share this post


Link to post
Share on other sites

Just tested on 2.3.2.

Save does not continue editing; instead, it saves then goes to the add new Hanna Code screen  :)

Edit:

The above refers to when you create a new Hanna Code. I was expecting save to let me continue editing; however, it takes me to the add new screen. In the case of existing Hanna Codes, if I edit them, save works as stated; I can continue editing. 

Edited by kongondo

Share this post


Link to post
Share on other sites
The above refers to when you create a new Hanna Code. I was expecting save to let me continue editing; however, it takes me to the add new screen. In the case of existing Hanna Codes, if I edit them, save works as stated; I can continue editing. 

Oops. Just fixed. :) Thanks. 

Share this post


Link to post
Share on other sites

Thanks, will test.

Btw, does it matter that the folder name has changed from TextformatterHannaCode to ProcessHannaCode from the point of view of installing/updating via Modules Manager? I recently got a gotcha when updating a module (I think it was PageDelete) who's folder name had changed to ProcessPageDelete or similar). I got a cannot redeclare class fatal error. What happened is that the update did not replace the old folder, hence, the class was getting called twice. Maybe the module name had changed as well, come to think of it..

Edited by kongondo

Share this post


Link to post
Share on other sites
Btw, does it matter that the folder name has changed from TextformatterHannaCode to ProcessHannaCode from the point of view of installing/updating via Modules Manager? I recently got a gotcha when updating a module (I think it was PageDelete) who's folder name had changed to ProcessPageDelete or similar). I got a cannot redeclare class fatal error. What happened is that the update did not replace the old folder, hence, the class was getting called twice. Maybe the module name had changed as well, come to think of it..

It's best that the directory name and filename don't change after it's installed. It should be uninstalled first, deleted, then re-installed, if such things change. I

It looks like I've got a disconnect between the class name listed on the modules directory and the repository name at GitHub. The class name listed in the modules directory is what should be used for the directory name (TextformatterHannaCode). Though you certainly could install it under ProcessHannaCode too, but this would confuse the modules manager (including the built-in one). So I recommend using a folder name of TextformatterHannaCode for compatibility with the modules directory.

Share this post


Link to post
Share on other sites

Ryan, is there a reason why I have to use echo instead of my preferred approach to using php when templating? i.e.:

<?
if ($page->rootParent->numChildren > 0) {
?>
	<nav>
		<ul class="subnav">
		<? 
		foreach($page->rootParent->children as $child) { 
		?>
			<li <? if($page === $child) echo 'class="active"' ?> ><a href='<?= $child->url ?>'><?= $child->title ?></a></li>
		<? 
		} 
		?>
		</ul><!-- /subnav -->
	</nav>
<?
}
?>

I really prefer the markup-first approach to keep the markup as structured and readable as possible (well, at least to my eyes). I'd hate to have to convert all of my code snippets in order to use them with hanna code.

Share this post


Link to post
Share on other sites

When you specify PHP as the type, then the Hanna code is a block of PHP. But you should be able to specify a closing PHP tag like ?> and then be in your HTML. If that does not work, start your Hanna code with: <?php ?>, which should prevent Hanna code from automatically inserting an opening PHP tag, and leave you in HTML.

  • Like 2

Share this post


Link to post
Share on other sites

Hey Ryan,

How would you recommend using Hanna code to wrap a larger amount of markup? For example, if a client wants to create a two column layout within a body section. E.g. In TinyMCE:

[[col2 content=

This is a block of content...

]]

This seems to work with the following simple PHP as a hanna code tag:

<?php echo "<div class=\"column\">\n".trim($content)."\n</div>\n"; ?>

When its output, I get invalid formatting much like this: (with closing and opening tags still being output due to breaks in hanna code tag within TinyMCE.

<div class="column"></p><p>This is content</p><p></div>

Would there be a way to create a hanna code tag wrapper type?

E.g.

[[col2]]

This is a block of content...

[[/col2]]

  • Like 2

Share this post


Link to post
Share on other sites

@ryanscherler

i've been doing that sort of thing by just using 2 hanna codes, one for the opening markup and one for the closing markup;

like this:

[[col2]]

This is a block of content...

[[_col2]]

eventually if the shortcodes module supports more than 1 shortcode per page, then this would be pretty easy to do with shortcode;

the biggest thing i'm lacking now in terms of hanna/shortcode is with respect to tabs and accordions, and being able to sometimes put a set of tabs inside a body content;

like this:

[[tab title=Tab 1]]

Tab content 1

[[tab title=Tab 2]]

tab content 2

[[/tabs]]

  • Like 1

Share this post


Link to post
Share on other sites

sometimes though you need to be able to just put in a section of a body with 2 columns, so repeaters are less flexible; and also a lot of sites i do have flexible column layouts like 1/3 - 2/3 or 1/5 - 4/5

shortcodes work ok for columns, but can be tricky with hanna codes if you need a column wrapper

[[columns]]

[[column50]]

text

[[_column]]

[[column50]]

text

[[_column]]

[[_columns]]

Share this post


Link to post
Share on other sites

Other possibility:

[[page rendered]] <--- actual $page (wrapper)

    // child page, 2 rows in repeater
    [col-50]txt[/col-50] - [col50]txt[/col50]

    // child page, 3 rows in repeater
    [col-33]txt[/col-33] - [col-33]txt[/col-33] - [col33]txt[/col33]

    // child page, 1 row in repeater
    [col-100]txt[/col-100]

    // child page, 4 rows in repeater
    [col-25]txt[/col-25] - [col-25]txt[/col-25] - [col-25]txt[/col-25] - [col-25]txt[/col-25]

[[/page rendered]]

Share this post


Link to post
Share on other sites

i get it.. that's a cool idea; but maybe a simple hanna code in combo with this:

http://welcome.totheinter.net/columnizer-jquery-plugin/

could be really the way to go for columns...

you could setup the js for some different columns and then use hanna for placing the div with the correct class before and after the text... then you could do this:

[[2col]]

a lot of text which will be rendered in multiple columns

[[_2col]]

it's responsive

Share this post


Link to post
Share on other sites

Or:

Every repeater is a row <div class='row'>

Repeater with a body field. (containing textformatter that splits the content in columns when finding a <hr />)

Share this post


Link to post
Share on other sites
How would you recommend using Hanna code to wrap a larger amount of markup? For example, if a client wants to create a two column layout within a body section. E.g. In TinyMCE:

Currently you can't pass multiline arguments to Hanna code. But I'm not sure how user friendly that looks even if you could. What I would probably suggest is to populate your content in a dedicated field on the page and have your Hanna code automatically look in that field. For example, your [col2] Hanna code might look like this:

<?php
if(!empty($attr['content'])) $content = $attr['content']; // use content attribute if supplied
  else $content = $page->col2; // otherwise pull from "col2" field on page
// ...now $content is ready for you to use
  • Like 1

Share this post


Link to post
Share on other sites

I'm having trouble with this hanna code:

<?php
foreach($page->children as $child) {
    echo '<h2>' . $child->title . '</h2>';
    echo $child->body;
}
?>

it's not working (it does work in the template) but in the hanna code, it only outputs the body of the last child.

Share this post


Link to post
Share on other sites

I'm having trouble with this hanna code:

<?php
foreach($page->children as $child) {
    echo '<h2>' . $child->title . '</h2>';
    echo $child->body;
}
?>

it's not working (it does work in the template) but in the hanna code, it only outputs the body of the last child.

I can confirm this. My best bet is that you've got enabled HannaCode as a textformatter in the setting of the "body"-field. I'm not sure what's happening, but I guess Hanna Code calls itself again, and overwrites the output itself. As a workaround, you could use different body-fields in parent and children - one with, the other one without Hanna Code enabled.

Share this post


Link to post
Share on other sites

right, i just reverted to doing it in the template... wonder if this could be fixed in hanna though..

Share this post


Link to post
Share on other sites

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 MoritzLost
      TrelloWire
      This is a module that allows you to automatically create Trello cards for ProcessWire pages and update them when the pages are updated. This allows you to setup connected workflows. Card properties and change handling behaviour can be customized through the extensive module configuration. Every action the module performs is hookable, so you can modify when and how cards are created as much as you need to. The module also contains an API-component that makes it easy to make requests to the Trello API and build your own connected ProcessWire-Trello workflows.
      Features
      All the things the module can do for you without any custom code: Create a new card on Trello whenever a page is added or published (you can select applicable templates). Configure the target board, target list, name and description for new cards. Add default labels and checklists to the card. Update the card whenever the page is updated (optional). When the status of the card changes (published / unpublished, hidden / unhidden, trashed / restored or deleted), move the card to a different list or archive or delete it (configurable). You can extend this through hooks in many ways: Modifiy when and how cards are created. Modify the card properties (Target board & list, title, description, et c.) before they are sent to Trello. Create your own workflows by utilizing an API helper class with many convenient utility methods to access the Trello API directly. Feedback & Future Plans
      Let me know what you think! In particular:
      If you find any bugs report them here or on Github, I'll try to fix them. This module was born out of a use-case for a client project where we manage new form submissions through Trello. I'm not sure how many use-cases there are for this module. If you do use it, tell me about it! The Trello API is pretty extensive, I'll try to add some more helper methods to the TrelloWireApi class (let me know if you need anything in particular). I'll think about how the module can support different workflows that include Twig – talk to me if you have a use-case! Next steps could be a dashboard to manage pages that are connected to a Trello card, or a new section in the settings tab to manage the Trello connection. But it depends on whether there is any interest in this 🙂 Links
      Repository on Github Complete module documentation (getting started, configuration & API documentation) [Module directory pending approval] Module configuration

    • By MoritzLost
      Process Cache Control
      This module provides a simple solution to clearing all your cache layers at once, and an extensible interface to perform various cache-related actions.
      The simple motivation behind this module was that I was tired of manually clearing caches in several places after deploying a change on a live site. The basic purpose of this module is a simple Clear all caches link in the Setup menu which clears out all caches, no matter where they hide. You can customize what exactly the module does through it's configuration menu:
      Expire or delete all cache entries in the database, or selectively clear caches by namespace ($cache API) Clear the the template render cache. Clear out specific folders inside your site's cache directory (/site/assets/cache) Clear the ProCache page render cache (if your site is using ProCache) Refresh version strings for static assets to bust client-side browser caches (this requires some setup, see the full documentation for details). This is the basic function of the module. However, you can also add different cache management action through the API and execute them through the module's interface. For this advanced usage, the module provides:
      An interface to see all available cache actions and execute them. A system log and logging output on the module page to see verify what the module is doing. A CacheControlTools class with utility functions to clear out different caches. An API to add cache actions, execute them programmatically and even modify the default action. Permission management, allowing you granular control over which user roles can execute which actions. The complete documentation can be found in the module's README.
      Plans for improvements
      If there is some interest in this, I plan to expand this to a more general cache management solution. I particular, I would like to add additional cache actions. Some ideas that came to mind:
      Warming up the template render cache for publicly accessible pages. Removing all active user sessions. Let me know if you have more suggestions!
      Links
      https://github.com/MoritzLost/ProcessCacheControl ProcessCacheControl in the Module directory CHANGELOG in the repository Screenshots


    • By Macrura
      PrevNextTabs Module
      Github: https://github.com/outflux3/PrevNextTabs
      Processwire helper modules for adding page navigation within the editor.
      Overview
      This is a very simple module that adds Previous and Next links inline with the tabs on the page editor. Hovering over the tab shows the title of the previous or next page (using the admin's built in jqueryUI tooltips.)
      Usage
      This module is typically used during development where you or your editors need to traverse through pages for the purpose of proofing, flagging and/or commenting. Rather than returning to the page tree or lister, they can navigate with these links.
      Warnings
      If you are using PW version 2.6.1 or later, the system will prevent you from leaving the page if you have unsaved edits.
      For earlier versions, to avoid accidentally losing changes made to a page that might occur if a user accidentally clicks on one of these, make sure to have the Form Save Reminder module installed.
      http://modules.processwire.com/modules/prev-next-tabs/
    • By Gadgetto
      SnipWire - Snipcart integration for ProcessWire
      Snipcart is a powerful 3rd party, developer-first HTML/JavaScript shopping cart platform. SnipWire is the missing link between Snipcart and the content management framework ProcessWire.
      With SnipWire, you can quickly turn any ProcessWire site into a Snipcart online shop. The SnipWire plugin helps you to get your store up and running in no time. Detailed knowledge of the Snipcart system is not required.
      SnipWire is free and open source licensed under Mozilla Public License 2.0! A lot of work and effort has gone into development. It would be nice if you could donate an amount to support further development:

      Status update links (inside this thread) for SnipWire development
      2020-03-21 -- SnipWire 0.8.5 (beta) released! Improves SnipWires webhooks interface and provides some other fixes and additions 2020-03-03 -- SnipWire 0.8.4 (beta) released! Improves compatibility for Windows based Systems. 2020-03-01 -- SnipWire 0.8.3 (beta) released! The installation and uninstallation process has been heavily revised. 2020-02-08 -- SnipWire 0.8.2 (beta) released! Added a feature to change the cart and catalogue currency by GET, POST or SESSION param 2020-02-03 -- SnipWire 0.8.1 (beta) released! All custom classes moved into their own namespaces. 2020-02-01 -- SnipWire is now available via ProcessWire's module directory! 2020-01-30 -- SnipWire 0.8.0 (beta) first public release! (module just submitted to the PW modules directory) 2020-01-28 -- added Custom Order Fields feature (first SnipWire release version is near!) 2020-01-21 -- Snipcart v3 - when will the new cart system be implemented? 2020-01-19 -- integrated taxes provider finished (+ very flexible shipping taxes handling) 2020-01-14 -- new date range picker, discount editor, order notifiactions, order statuses, and more ... 2019-11-15 -- orders filter, order details, download + resend invoices, refunds 2019-10-18 -- list filters, REST API improvements, new docs platform, and more ... 2019-08-08 -- dashboard interface, currency selector, managing Orders, Customers and Products, Added a WireTabs, refinded caching behavior 2019-06-15 -- taxes provider, shop templates update, multiCURL implementation, and more ... 2019-06-02 -- FieldtypeSnipWireTaxSelector 2019-05-25 -- SnipWire will be free and open source Plugin Key Features
      Fast and simple store setup Full integration of the Snipcart dashboard into the ProcessWire backend (no need to leave the ProcessWire admin area) Browse and manage orders, customers, discounts, abandoned carts, and more Multi currency support Custom order and cart fields Process refunds and send customer notifications from within the ProcessWire backend Process Abandoned Carts + sending messages to customers from within the ProcessWire backend Complete Snipcart webhooks integration (all events are hookable via ProcessWire hooks) Integrated taxes provider (which is more flexible then Snipcart own provider) Useful Links
      SnipWire in PW modules directory SnipWire Docs (please note that the documentation is a work in progress) SnipWire @GitHub (feature requests and suggestions for improvement are welcome - I also accept pull requests) Snipcart Website  
      ---- INITIAL POST FROM 2019-05-25 ----
       
×
×
  • Create New...