[TYPO3-project-formidable] Template Engine: Bug when using isLoggedIn().isFalse() twice

Hauke Hain newgrp at googlemail.com
Fri Mar 6 17:32:36 CET 2009


Hi Jerome,

oh, that is great to know.

Oh yeah such errors are not easy to fix. I also need much time for fixing 
regular expressions. Especially to get to knwo what Expressions are 
availlable and what they do.

I am very happy that the solution came up so fast. Thank you very much. I 
appreciate your big support!

Regards,
Hauke

"Jerome Schneider" <typo3dev at ameos.com> schrieb im Newsbeitrag 
news:mailman.1.1236349608.20104.typo3-project-formidable at lists.netfielders.de...
> Note:
> in the pattern, I added a "?" after the central [^\1]* that you came up 
> with. This "?" mean: non greedy, in other words: please work on the 
> smallest possible subpart matching the pattern, not the largest one.
>
> Happy coding,
> Jerome
>
> Jerome Schneider a écrit :
>> Hi Hauke !
>> I reproduced the bug.
>>
>> I just corrected it :) it took me 3 hours, but here is the correct 
>> pattern:
>>
>> /\<\!\-\-.*(\#\#\#(.+)\ 
>> \bperimeter\b\#\#\#).*\-\-\>([^\1]*?)\<\!\-\-.*\1.*\-\-\>/
>>
>> It's published in revision 2.0.236 (I have committed to SVN but not built 
>> it as zip or T3X yet).
>>
>>
>> I tested it against this template, and everything was processed 
>> correctly.
>>
>>
>> I hope you can confirm the resolution. Thanks for reporting, btw !
>>
>> Best regards,
>> Jerome Schneider
>>
>> <!-- ###MAIN### begin-->
>>
>>   <h3>DEBUT</H3>
>>
>>   <!-- ###"hello".equals("world") perimeter### begin-->
>>     <H2>NON 1</H2>
>>   <!-- ###"hello".equals("world") perimeter### end-->
>>
>>   <h3>INTER1</H3>
>>
>>   <!-- ###"hello".equals("hello") perimeter### begin-->
>>     <H2>OUI 1</H2>
>>
>>     <!-- ###"yes".equals("yes") perimeter### begin-->
>>       <H2>OUI 1.1</H2>
>>
>>       <!-- ###"abc".equals("abc") perimeter### begin-->
>>         <H2>OUI 1.1.1</H2>
>>       <!-- ###"abc".equals("abc") perimeter### end-->
>>
>>       <!-- ###"abc".equals("xyz") perimeter### begin-->
>>         <H2>NON 1.1.2</H2>
>>       <!-- ###"abc".equals("xyz") perimeter### end-->
>>
>>       <!-- ###"abc".equals("abc") perimeter### begin-->
>>         <H2>OUI 1.1.3</H2>
>>       <!-- ###"abc".equals("abc") perimeter### end-->
>>
>>     <!-- ###"yes".equals("yes") perimeter### end-->
>>
>>     <!-- ###"yes".equals("no") perimeter### begin-->
>>       <H2>NON 1.1</H2>
>>     <!-- ###"yes".equals("no") perimeter### end-->
>>
>>   <!-- ###"hello".equals("hello") perimeter### end-->
>>
>>   <h3>INTER2</H3>
>>
>>   <!-- ###"hello".equals("world") perimeter### begin-->
>>     <H2>NON 2</H2>
>>   <!-- ###"hello".equals("world") perimeter### end-->
>>
>>   <h3>INTER3</H3>
>>
>>   <!-- ###"hello".equals("hello") perimeter### begin-->
>>     <H2>OUI 2</H2>
>>   <!-- ###"hello".equals("hello") perimeter### end-->
>>
>>   <h3>FIN</H3>
>>
>> <!-- ###MAIN### end-->
>>
>> Note
>>
>> Hauke Hain a écrit :
>>> Hi,
>>>
>>> I am not quite sure why my templates does not work with formidable 
>>> without changing the pattern.
>>>
>>> If I do not change it to $sPattern = '/\<\!\-\-.*(\#\#\#(.+)\ 
>>> \bperimeter\b\#\#\#).*begin\-\-\>([^\\1.]*)\<\!\-\-.*\\1.*end\-\-\>/';
>>> I do not get anything displayed.
>>>
>>> However, can you repeat the Bug? I think the whole thing would work with 
>>> replace instead of using regular expressions, as TYPO3 uses it.
>>>
>>> If it is ok, you may change the $pattern to my version. It is a bit more 
>>> specific and the groups are different. And it works for me only.
>>> On the other hand: Can you imagine why this happens to me? Perhaps you 
>>> see something I don't (within the other posts in this thread).
>>>
>>> Thank you in advance.
>>>
>>> Kind regards,
>>> Hauke
>>>
>>> "Hauke Hain" <newgrp at googlemail.com> schrieb im Newsbeitrag 
>>> news:mailman.1.1235588293.18628.typo3-project-formidable at lists.netfielders.de...
>>>> Regular Expressions are powerful, but not easy to understand.
>>>>
>>>> I do not understand how the function processPerimetersCallBack is 
>>>> called.
>>>>
>>>> It is calles via
>>>> $sHtml = preg_replace_callback(
>>>>   $sPattern,
>>>>   array(
>>>>    &$this,
>>>>    "processPerimetersCallBack"
>>>>   ),
>>>>   $sHtml,
>>>>   -1 // no limit
>>>>  );
>>>>
>>>> But how does it get its parameter?
>>>>
>>>>
>>>>
>>>> The problem with processPerimeters is, that Match[3] contents the whole 
>>>> content from the first <!-- ###isLoggedIn().isFalse() perimeter### 
>>>> begin--> to the last <!-- ###isLoggedIn().isFalse() perimeter### 
>>>> end-->....
>>>>
>>>>
>>>> And sorry, I said a few hours ago, that this only happens with 
>>>> isLoggedIn().isFalse()  - it seems to happen with every condition which 
>>>> is used more than once.
>>>>
>>>>
>>>>
>>>> I changed in the regular expression that not every a-z and A-Z 
>>>> charackter is ok, but every charackter that is not the first 
>>>> group-string:
>>>> [^\\1.]
>>>>
>>>> Replace
>>>>  $sPattern = '/\<\!\-\-.*(\#\#\#(.+)\ 
>>>> \bperimeter\b\#\#\#).*begin\-\-\>([\w\W]*)\<\!\-\-.*\\1.*end\-\-\>/';
>>>> with
>>>> $sPattern = '/\<\!\-\-.*(\#\#\#(.+)\ 
>>>> \bperimeter\b\#\#\#).*begin\-\-\>([^\\1.]*)\<\!\-\-.*\\1.*end\-\-\>/';
>>>>
>>>>
>>>> Now everything is shown and nothing left, but *some* parts are shown, 
>>>> that shouldn't.
>>>>
>>>> The first <!-- ###isLoggedIn().isFalse() perimeter### begin--> ... <!--  
>>>> ###isLoggedIn().isFalse() perimeter### end--> Part is shown or hidden 
>>>> as it should be.
>>>>
>>>> The second Part is always shown.
>>>>
>>>> At least nothing is left anymore.
>>>>
>>>> I hope you can fix the rest. That was enough for today.
>>>>
>>>> Sincerely,
>>>> Hauke
>>>>
>>> 



More information about the TYPO3-project-formidable mailing list