2015-01-28 2 views
2

Typo3의 뉴스 확장 tx_news에 대한 특수 템플릿을 작업 중입니다. 저는 Typo3와 특히 Fluid에 완전히 익숙합니다.유체 템플릿의 newsItem을 렌더링하기위한 조건 인 경우/

내가 원하는 것은 정확하게 4 개의 뉴스 항목의 출력이지만,이 항목들 각각에는 이미지가 있어야합니다.

프로그래밍 논리가 필요합니다. newsItem에 이미지가 있고 지금까지 렌더링 된 항목이 4 개 미만인 경우 렌더링합니다. 다른 사람은 아무 것도하지 않습니다.

나는이 질문과 대답을 읽었습니다 : TYPO3 Fluid complex if conditions 그래서 나는 viewhelper와 같은 것이 필요하다고 생각합니다.

<f:for each="{news}" as="newsItem" iteration="iterator"> 
     <f:if condition="{newsItem.falMedia}"> 
      <f:if condition="{iterator.cycle}<=4"> 
       <f:render partial="List/TeaserItem" arguments="{newsItem: newsItem,settings:settings,iterator:iterator, contentObjectData:contentObjectData}" /> 
      </f:if> 
     </f:if> 
    </f:for> 

그러나 뉴스를 통해 4 번 반복 한 후 물론 정지의 의지 :

지금까지 내 템플릿 출력 항목에이 코드를 가지고있다. 따라서 이미지가없는 항목 하나가 렌더링되지 않으면 세 항목 만 출력됩니다.

이 같은의 경우 조건 종류 필요할 것 :

if ({newsItem.falMedia} && {iterator.cycle}<=4){ 
     render image } 
else {iterator.cycle--} 

을하지만 난에 대한 루프 새로운 viewhelper에, 특히 통과하는 제의 반복자 변수를 전달하는 방법을 알아낼 수 없습니다 그것은 for-loop로 돌아 간다.

+0

내가 지금 extendedForViewHelper를 작성하려고했으나 정규 동안 조건이 condition = {newsItem.falMedia}를 존중하고 true/false를 반환하면 forViewHelper에 넣을 수 없습니다. '$ iterationData = array ( 'index'= )'$ iterationData = array ($ each, $ as, $ key = '', $ reverse = FALSE, $ iteration = NULL, $ condition) > 0, '주기'=> 1, 'imageCount'=> 0, '총계'= 개수 ($ arguments [ 'each']) ) '및 'if ($ arguments ['condition ' ] === TRUE) { $ iterationData [ 'imageCount'] ++; }' – deadfishli

답변

1

간단히 말해서 이런 종류의 논리는 유체에서 불가능합니다. 이유는 단순한 템플릿 엔진입니다.

자신 만의 확장 기능을 만들고 여기에 ViewHelper를 만들어야합니다.이 기능은 필요한 설정 (이 경우 falMedia)이 있는지를 확인하고 반복 할 수있는 제한된 배열을 반환합니다. 실제로 f:for을 재사용하는 것이 가장 빠른 솔루션입니다.

나는 그것이 유일한 방법입니다.

<?php 
namespace TYPO3\CMS\Fluid\ViewHelpers; 

class ForNewsWithMediaViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper { 

    /** 
    * Iterates through elements of $each and renders child nodes 
    * 
    * @param array $each The array or \TYPO3\CMS\Extbase\Persistence\ObjectStorage to iterated over 
    * @param string $as The name of the iteration variable 
    * @param string $key The name of the variable to store the current array key 
    * @param boolean $reverse If enabled, the iterator will start with the last element and proceed reversely 
    * @param string $iteration The name of the variable to store iteration information (index, cycle, isFirst, isLast, isEven, isOdd) 
    * @param int $limit Limit of the news items to show 
    * @return string Rendered string 
    * @api 
    */ 
    public function render($each, $as, $key = '', $reverse = FALSE, $iteration = NULL, $limit = NULL) { 
     return self::renderStatic($this->arguments, $this->buildRenderChildrenClosure(), $this->renderingContext, $limit); 
    } 

    /** 
    * @param array $arguments 
    * @param \Closure $renderChildrenClosure 
    * @param \TYPO3\CMS\Fluid\Core\Rendering\RenderingContextInterface $renderingContext 
    * @param int $limit Limit of the news items to show 
    * @return string 
    * @throws \TYPO3\CMS\Fluid\Core\ViewHelper\Exception 
    */ 
    static public function renderStatic(array $arguments, \Closure $renderChildrenClosure, \TYPO3\CMS\Fluid\Core\Rendering\RenderingContextInterface $renderingContext, $limit = NULL) { 
     $templateVariableContainer = $renderingContext->getTemplateVariableContainer(); 
     if ($arguments['each'] === NULL) { 
      return ''; 
     } 
     if (is_object($arguments['each']) && !$arguments['each'] instanceof \Traversable) { 
      throw new \TYPO3\CMS\Fluid\Core\ViewHelper\Exception('ForViewHelper only supports arrays and objects implementing \Traversable interface', 1248728393); 
     } 

     if ($arguments['reverse'] === TRUE) { 
      // array_reverse only supports arrays 
      if (is_object($arguments['each'])) { 
       $arguments['each'] = iterator_to_array($arguments['each']); 
      } 
      $arguments['each'] = array_reverse($arguments['each']); 
     } 
     $iterationData = array(
      'index' => 0, 
      'cycle' => 1, 
      'total' => count($arguments['each']) 
     ); 

     $limitCycle = 1; 
     $output = ''; 
     /** 
     * @type $singleElement Tx_News_Domain_Model_News 
     */ 
     foreach ($arguments['each'] as $keyValue => $singleElement) { 

      if (is_null($singleElement->getFalMedia()) 
       || !is_null($limit) && $limitCycle > $limit 
      ) { 
       continue; 
      } 

      $limitCycle++; 

      $templateVariableContainer->add($arguments['as'], $singleElement); 
      if ($arguments['key'] !== '') { 
       $templateVariableContainer->add($arguments['key'], $keyValue); 
      } 
      if ($arguments['iteration'] !== NULL) { 
       $iterationData['isFirst'] = $iterationData['cycle'] === 1; 
       $iterationData['isLast'] = $iterationData['cycle'] === $iterationData['total']; 
       $iterationData['isEven'] = $iterationData['cycle'] % 2 === 0; 
       $iterationData['isOdd'] = !$iterationData['isEven']; 
       $templateVariableContainer->add($arguments['iteration'], $iterationData); 
       $iterationData['index']++; 
       $iterationData['cycle']++; 
      } 
      $output .= $renderChildrenClosure(); 
      $templateVariableContainer->remove($arguments['as']); 
      if ($arguments['key'] !== '') { 
       $templateVariableContainer->remove($arguments['key']); 
      } 
      if ($arguments['iteration'] !== NULL) { 
       $templateVariableContainer->remove($arguments['iteration']); 
      } 
     } 
     return $output; 
    } 
} 

그래서 당신이로보기에서 사용할 수 있습니다 : 여기

은 샘플 (원본 f:for viewhelper과 비교)의

<f:forNewsWithMedia each="{news}" as="newsItem" iteration="iterator" limit="4"> 
    <f:render partial="List/TeaserItem" arguments="{newsItem: newsItem,settings:settings,iterator:iterator, contentObjectData:contentObjectData}" /> 
</f:forNewsWithMedia> 
+0

고마워요! 나는 조금 혼란 스럽다. 그래서이 뷰 헬퍼를 넣기 위해 새로운 확장을 설정해야합니까? 새로운 시청자로서 뉴스 확장에 넣을 수는 없습니까? – deadfishli

+0

이 샘플은'typo3/sysext/fluid/Classes/ViewHelpers/ForNewsWithMediaViewHelper에 넣을 수 있습니다.php'를 테스트 해보아야합니다. 어쨌든, 그렇습니다. TYPO3 소스 나 저장소의 확장을 변경하면 안됩니다. 따라서 이상적인 솔루션은 사용자 정의 네임 스페이스로 ext를 작성한 다음 거기에 붙여 넣는 것입니다. 그렇지 않으면 다음 소스 업데이트 후에 잃어 버릴 위험이 있습니다. – biesior

+0

그래서 4 개의 요소 만 출력하지만 그림이없는 요소는 여전히 출력됩니다 ... – deadfishli

관련 문제