2015-01-07 8 views
1

블록을 반복하는 블록 작성기를 작성하면 양식 데이터베이스를 순서대로 가져옵니다. While 루프를 통해 배열

if(loop_blocks()) { 
    while(loop_blocks()) { 
     if(have_block('standard-content-block')) { 
      echo 'standard-content-block'; 
     } 

     elseif(have_block('executive-intro-block')) { 
      echo 'executive intro block'; 
     } 
    } 
} 

내 기능 loop_blocks

를 위해 데이터베이스로부터 블록을 가져와 전역 변수로 배열을 설정

function loop_blocks() { 
     global $db; 

     $page_id = get_page_id(); 
     $GLOBALS['loop_position'] = 0; 
     $loop_position = $GLOBALS['loop_position']; 

     $stm = $db->prepare("SELECT * FROM page_blocks WHERE page_id = :id ORDER BY `block_order` ASC"); 
     $stm->execute(array(':id' => $page_id)); 
     $res = $stm->fetchAll(); 
     $GLOBALS['block_loop'] = $res; 
     if(!$res) { 
      return false; 
     } elseif(!$GLOBALS['block_loop'][$loop_position]) { 
      return false; 
     } else { 
      return true; 
     } 
    } 

함수 have_block 현재 루프의 위치를 ​​얻고, 이름 결정된 여부 판단 어레이에 존재하며 루프의 위치 증가 : 무한 루프 그러나

function have_block($block_name) { 
     $loop_position = $GLOBALS['loop_position']; 

     if(!$GLOBALS['block_loop'][$loop_position]) { 
      return false; 
     } elseif(!$GLOBALS['block_loop'][$loop_position][block_name] = $block_name) { 
      return false; 
     } else { 
      $GLOBALS['loop_position'] = $loop_position+1; 
      return true; 
     } 
    } 

이 반환 및 I는 t에 while 루프를 이동하는 방법을 알아낼 수 없다 그 다음 단계?

EDIT have_block 함수는 현재 블록 id에 대한 전역 변수를 설정하므로 while 루프를 사용하고 있습니다. 그런 다음 the_element라는 함수 내에서 사용됩니다. 예를 들면 : 나는이를 설정하는 기능 have_block를 사용하지 않는 경우

if(loop_blocks()) { 
    while(loop_blocks()) { 
     if(have_block('standard-content-block')) { 
      the_element('heading'); 
     } 
    } 
} 

, 나는 두 번째 인수로 모든 요소에 foreach 루프에서 블록 ID를 전달해야 할 것입니다.

+1

왜 도대체 while 루프가 필요합니까? –

+0

'foreach' 루프를 사용하여 전체 배열을 살펴볼 수 있습니다. 'foreach ($ res as $ item) {// 물건을해라}' –

+0

'loop_blocks()'에서'loop_position'을 0으로 재설정 할 때마다 루프를 반복합니다. 글로벌 변수는 일반적으로 좋지 않지만이 경우에는 완전히 필요하지 않습니다. – Jim

답변

0

@Jim에 의해 this가 고정되었는데 while 루프가 무한 반복되는 이유 인 loop_blocks() 내에서 loop_position을 다시 설정하고 있음을 알 수 있습니다.

} elseif(!$GLOBALS['block_loop'][$loop_position][block_name] = $block_name) { 
     return false; 

가되어 있어야합니다 : 내가 잘못된 장소에 느낌표했다

} elseif($GLOBALS['block_loop'][$loop_position][block_name] != $block_name) { 
     return false; 

주를 입력 할 때 다음 오류의 단순한 사건이었다. 이제 필요한만큼 완벽하게 작동합니다.

+0

을 반환 할 때 fetchAll()의 결과를 확인하십시오. 잘못된 위치에 느낌표가 있었던 것은 아니며, 평등을 검사하는 대신 '='을 사용하여 assigment로 사용했습니다. '=='이어야하고 처음에 느낌표를 남겨 둘 수 있습니다. –