Создание компоновщика блоков, который проходит по блокам по порядку.
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;
}
}
Однако это возвращает бесконечный цикл, и я не могу найти способ переместить цикл while на следующий шаг?
РЕДАКТИРОВАТЬ Я использую цикл while, потому что функция have_block установит глобальную переменную для текущего идентификатора блока. Это будет затем использоваться в функции под названием the_element. Такие как:
if( loop_blocks()) {
while( loop_blocks()) {
if( have_block('standard-content-block')) {
the_element('heading');
}
}
}
Если я не использую функцию have_block, чтобы установить это, мне нужно передать идентификатор блока из цикла foreach в каждый элемент в качестве второго аргумента.
Я исправил это, поскольку @Jim отметил, что я переустанавливал loop_position в loop_blocks (), поэтому цикл while повторялся бесконечно. Это был простой случай ошибки при наборе текста:
} elseif(!$GLOBALS['block_loop'][$loop_position][block_name] = $block_name) {
return false;
Должно было:
} elseif($GLOBALS['block_loop'][$loop_position][block_name] != $block_name) {
return false;
Обратите внимание, что у меня был восклицательный знак в неправильном месте.
Теперь это работает отлично, как мне нужно.
Других решений пока нет …