Soma Posted August 3, 2013 Share Posted August 3, 2013 It's render($field), not render([ ]). So jmartsch example is little off.Actually doesn't work. But with the fix both work. Link to comment Share on other sites More sharing options...
ryan Posted August 4, 2013 Author Share Posted August 4, 2013 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. 2 Link to comment Share on other sites More sharing options...
dotnetic Posted August 5, 2013 Share Posted August 5, 2013 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? 1 Link to comment Share on other sites More sharing options...
dotnetic Posted August 5, 2013 Share Posted August 5, 2013 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? Link to comment Share on other sites More sharing options...
ryan Posted August 5, 2013 Author Share Posted August 5, 2013 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. Link to comment Share on other sites More sharing options...
ryan Posted August 5, 2013 Author Share Posted August 5, 2013 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. 2 Link to comment Share on other sites More sharing options...
kongondo Posted August 5, 2013 Share Posted August 5, 2013 Christmas has come early! Thanks Ryan! Link to comment Share on other sites More sharing options...
kongondo Posted August 5, 2013 Share Posted August 5, 2013 (edited) 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 August 5, 2013 by kongondo Link to comment Share on other sites More sharing options...
ryan Posted August 5, 2013 Author Share Posted August 5, 2013 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. Link to comment Share on other sites More sharing options...
kongondo Posted August 5, 2013 Share Posted August 5, 2013 (edited) 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 August 5, 2013 by kongondo Link to comment Share on other sites More sharing options...
ryan Posted August 6, 2013 Author Share Posted August 6, 2013 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. Link to comment Share on other sites More sharing options...
thetuningspoon Posted August 22, 2013 Share Posted August 22, 2013 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. Link to comment Share on other sites More sharing options...
ryan Posted August 24, 2013 Author Share Posted August 24, 2013 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. 2 Link to comment Share on other sites More sharing options...
thetuningspoon Posted August 24, 2013 Share Posted August 24, 2013 Awesome! I'll give it a try. Link to comment Share on other sites More sharing options...
ryanscherler Posted August 28, 2013 Share Posted August 28, 2013 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]] 2 Link to comment Share on other sites More sharing options...
Macrura Posted August 29, 2013 Share Posted August 29, 2013 @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]] 1 Link to comment Share on other sites More sharing options...
Martijn Geerts Posted August 29, 2013 Share Posted August 29, 2013 For columns of text I prefer repeaters. Link to comment Share on other sites More sharing options...
Macrura Posted August 29, 2013 Share Posted August 29, 2013 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]] Link to comment Share on other sites More sharing options...
Martijn Geerts Posted August 29, 2013 Share Posted August 29, 2013 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]] 1 Link to comment Share on other sites More sharing options...
Macrura Posted August 29, 2013 Share Posted August 29, 2013 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 Link to comment Share on other sites More sharing options...
Martijn Geerts Posted August 29, 2013 Share Posted August 29, 2013 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 />) Link to comment Share on other sites More sharing options...
ryan Posted September 1, 2013 Author Share Posted September 1, 2013 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 1 Link to comment Share on other sites More sharing options...
Macrura Posted September 1, 2013 Share Posted September 1, 2013 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. Link to comment Share on other sites More sharing options...
titanium Posted September 1, 2013 Share Posted September 1, 2013 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. Link to comment Share on other sites More sharing options...
Macrura Posted September 2, 2013 Share Posted September 2, 2013 right, i just reverted to doing it in the template... wonder if this could be fixed in hanna though.. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now