Gomlers Posted February 13, 2014 Share Posted February 13, 2014 Hi! First post, beginner in PHP - please be nice I have a webshop with tags on the left column. The shop is not open to public yet, so unfortunately I can't pass a link to it. The left-column isn't wide enough to show all the tags on one line, so they are splitted into separate lines. I don't want the last tag on each line to be separated - as in burgundy widgets in my example: green widgets red widgets blue widgets burgundy widget I want it like this: green widgets red widgets blue widgets burgundy widgets Prestashop uses smarty to generate the html in the .tpl files, so I guess I need to write a function that fixes this in tags.php and then put something from that php-function into the tags.tpl file? I think this is an example of what I'm trying to do: $longString = 'I like apple. You like oranges. We like fruit. I like meat, also.'; $arrayWords = explode(' ', $longString); // Max size of each line $maxLineLength = 18; // Auxiliar counters, foreach will use them $currentLength = 0; $index = 0; foreach($arrayWords as $word) { // +1 because the word will receive back the space in the end that it loses in explode() $wordLength = strlen($word) + 1; if( ( $currentLength + $wordLength ) <= $maxLineLength ) { $arrayOutput[$index] .= $word . ' '; $currentLength += $wordLength; } else { $index += 1; $currentLength = $wordLength; $arrayOutput[$index] = $word; } } ... but I don't know how to get it right with smarty and everything. Any help would be appreciated, as I'm trying to learn Quote Link to comment Share on other sites More sharing options...
.josh Posted February 13, 2014 Share Posted February 13, 2014 According to your code, you are exploding at spaces and building new lines based on individual words. So, how are you even determining which words should be "double" words? Quote Link to comment Share on other sites More sharing options...
Gomlers Posted February 14, 2014 Author Share Posted February 14, 2014 (edited) Ok - I just used that code as an example, I found it stackoverflow. Sorry, than that is NOT what I want I'm a complete beginner to php! I would of course like to explode by the actual tags, not the blank spaces in between which ever word.. Can I do something with the <a href=""> that is wrapped around every tag? Edited February 14, 2014 by Gomlers Quote Link to comment Share on other sites More sharing options...
.josh Posted February 14, 2014 Share Posted February 14, 2014 Okay, so in your script, how are the tags currently stored? For example, if you already have them in an array, you can do this: // example array of tags $tags = array( 'tag', 'tag', 'another tag' ); $array = array_map( function($v){return str_replace(' ',' ',$v);}, $tags ); Basically the goal is to replace the spaces with . Quote Link to comment Share on other sites More sharing options...
Gomlers Posted February 14, 2014 Author Share Posted February 14, 2014 (edited) Wow, you are fast! Thank you. This is how the function in the tag.php looks like: function hookLeftColumn($params) { $tags = Tag::getMainTags((int)($params['cookie']->id_lang), (int)(Configuration::get('BLOCKTAGS_NBR'))); $max = -1; $min = -1; foreach ($tags as $tag) { if ($tag['times'] > $max) $max = $tag['times']; if ($tag['times'] < $min || $min == -1) $min = $tag['times']; } if ($min == $max) $coef = $max; else { $coef = (BLOCKTAGS_MAX_LEVEL - 1) / ($max - $min); } if (!sizeof($tags)) return false; foreach ($tags AS &$tag) $tag['class'] = 'tag_level'.(int)(($tag['times'] - $min) * $coef + 1); $this->smarty->assign('tags', $tags); return $this->display(__FILE__, 'blocktags.tpl'); } Wish I could paste my new great example code that almost works below, but I'm really confused Instead, here is the blocktags.tpl the way it is originally from prestashop {if $tags} {foreach from=$tags item=tag name=myLoop} <a href="{$link->getPageLink('search', true, NULL, "tag={$tag.name|urlencode}")|escape:'html'}" title="{l s='More about' mod='blocktags'} {$tag.name|escape:html:'UTF-8'}" class="{$tag.class} {if $smarty.foreach.myLoop.last}last_item{elseif $smarty.foreach.myLoop.first}first_item{else}item{/if}">{$tag.name|escape:html:'UTF-8'}</a> {/foreach} {else} {l s='No tags have been specified yet.' mod='blocktags'} {/if} Edited February 14, 2014 by Gomlers Quote Link to comment Share on other sites More sharing options...
.josh Posted February 14, 2014 Share Posted February 14, 2014 well, based on the posted code, perhaps in tag.php, you can change this: foreach ($tags AS &$tag) $tag['class'] = 'tag_level'.(int)(($tag['times'] - $min) * $coef + 1); To this: foreach ($tags AS &$tag) { $tag['class'] = 'tag_level'.(int)(($tag['times'] - $min) * $coef + 1); $tag['name'] = str_replace(' ',' ',$tag['name']); } Quote Link to comment Share on other sites More sharing options...
Gomlers Posted February 14, 2014 Author Share Posted February 14, 2014 That actually almost worked The tags came on separate lines if they are too long, but the is shown between the words. Like blue widgets white widgets and so on.. But I feel you got me closer to the solution I'm trying to understand why... Quote Link to comment Share on other sites More sharing options...
.josh Posted February 14, 2014 Share Posted February 14, 2014 I had a feeling that might happen.. I figured the smarty code might somehow escape it or htmlentities it. Perhaps remove what you just changed and instead, try changing your smarty template code to this: adding |replace:' ':' ' {if $tags} {foreach from=$tags item=tag name=myLoop} <a href="{$link->getPageLink('search', true, NULL, "tag={$tag.name|urlencode}")|escape:'html'}" title="{l s='More about' mod='blocktags'} {$tag.name|escape:html:'UTF-8'}" class="{$tag.class} {if $smarty.foreach.myLoop.last}last_item{elseif $smarty.foreach.myLoop.first}first_item{else}item{/if}">{$tag.name|escape:html:'UTF-8'|replace:' ':' '}</a> {/foreach} {else} {l s='No tags have been specified yet.' mod='blocktags'} {/if} Unfortunately, I don't have much experience with smarty, so it's just a guess based on a quick google search. Quote Link to comment Share on other sites More sharing options...
Gomlers Posted February 14, 2014 Author Share Posted February 14, 2014 (edited) Well, your google search and guesswork did very well! It looks perfect now.. Thank you very much Josh! What a great forum-experience this was. Problem solved in less than an hour! Is this because foreach variable as variable puts all the tags in an array, so the only thing the script needed, was to output the tag "red widgets" as a combined html-code red widgets which wouldn't break? Edited February 14, 2014 by Gomlers Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.