У меня есть простая рекуррентная функция для вывода значений массива на веб-страницу. Он отлично работает, если я использую его от cms3\index.php
. Но работает только частично (первый раунд), если я использую его от cms34\ww.admin\pages\menu.php
.php CMS, код работает от index.php, но он не работает из более глубокой папки проекта CMS
Я просматривал книги: "CMS Design Использование PHP и JQuery", https://www.packtpub.com/web-develop...php-and-jquery В третьей главе они дают простой CMS пример.
Нижеприведенный сценарий должен читать базу данных и создавать гиперссылки на две веб-страницы.
// cms34\ww.admin\pages\menu.php
<?php
echo '<div id="pages-wrapper">';
$rs=dbAll('select id,type,name,parent from pages order by ord,name');
$pages=array();
foreach($rs as $r){
if(!isset($pages[$r['parent']]))$pages[$r['parent']]=array();
$pages[$r['parent']][]=$r;
}
function show_pages($id,$pages){
if(!isset($pages[$id]))return;
echo '<ul>';
foreach($pages[$id] as $page){
echo '<li id="page_'.$page['id'].'"><a href="pages.php?id='.$page['id'].'">';
echo '<ins> </ins>'.htmlspecialchars($page['name']).'</a>';
show_pages($page['id'],$pages);
echo '</li>';
}
echo '</ul>';
}
show_pages(0,$pages);
echo '</div>';
Это тот же скрипт с добавлением print_r
для отладки.
<?php
echo '<div id="pages-wrapper">';
$rs=dbAll('select id,type,name,parent from pages order by ord,name');
print_r('<br> in menu.php rs=').print_r($rs);
$pages=array();
foreach($rs as $r){
print_r('<br> in menu.php before if r=').print_r($r);
if(!isset($pages[$r['parent']]))$pages[$r['parent']]=array();
$pages[$r['parent']][]=$r;
print_r('<br> in menu.php after if r=').print_r($r).print_r(' ;;r[parent][0]=').print_r($r['parent'][0]);
}
function show_pages($id,$pages){
print_r('<br> in menu.php function show_pages, $id =').print_r($id);
print_r('<br> in menu.php function show_pages, $pages =').print_r($pages);
print_r('<br> in menu.php function show_pages, $pages[$id] =').print_r($pages[$id]);
if(!isset($pages[$id]))return;
echo '<ul>';
foreach($pages[$id] as $page){
print_r('<br> in menu.php foreach ').print_r(htmlspecialchars($page['name']));
echo '<li id="page_'.$page['id'].'"><a href="pages.php?id='.$page['id'].'">';
echo '<ins> </ins>'.htmlspecialchars($page['name']).'</a>';
show_pages($page['id'],$pages);
echo '</li>';
}
echo '</ul>';
}
show_pages(0,$pages);
echo '</div>';
Это как веб-страница выглядит:
rs=Array ([0] => Array ([id] => 24 [type] => 0 [name] => Home [parent] => 0) [1] => Array ([id] => 35 [type] => 0 [name] => Home2 [parent] => 0) [2] => Array ([id] => 36 [type] => 0 [name] => test [parent] => 24) [3] => Array ([id] => 38 [type] => 0 [name] => test3 [parent] => 24) [4] => Array ([id] => 25 [type] => 0 [name] => Second Page [parent] => 0))
in menu.php before if r=Array ([id] => 24 [type] => 0 [name] => Home [parent] => 0)
in menu.php after if r=Array ([id] => 24 [type] => 0 [name] => Home [parent] => 0) ;;r[parent][0]=0
in menu.php before if r=Array ([id] => 35 [type] => 0 [name] => Home2 [parent] => 0)
in menu.php after if r=Array ([id] => 35 [type] => 0 [name] => Home2 [parent] => 0) ;;r[parent][0]=0
in menu.php before if r=Array ([id] => 36 [type] => 0 [name] => test [parent] => 24)
in menu.php after if r=Array ([id] => 36 [type] => 0 [name] => test [parent] => 24) ;;r[parent][0]=2
in menu.php before if r=Array ([id] => 38 [type] => 0 [name] => test3 [parent] => 24)
in menu.php after if r=Array ([id] => 38 [type] => 0 [name] => test3 [parent] => 24) ;;r[parent][0]=2
in menu.php before if r=Array ([id] => 25 [type] => 0 [name] => Second Page [parent] => 0)
in menu.php after if r=Array ([id] => 25 [type] => 0 [name] => Second Page [parent] => 0) ;;r[parent][0]=0
in menu.php function show_pages, $id =0
in menu.php function show_pages, $pages =Array ([0] => Array ([0] => Array ([id] => 24 [type] => 0 [name] => Home [parent] => 0) [1] => Array ([id] => 35 [type] => 0 [name] => Home2 [parent] => 0) [2] => Array ([id] => 25 [type] => 0 [name] => Second Page [parent] => 0)) [24] => Array ([0] => Array ([id] => 36 [type] => 0 [name] => test [parent] => 24) [1] => Array ([id] => 38 [type] => 0 [name] => test3 [parent] => 24)))
in menu.php function show_pages, $pages[$id] =Array ([0] => Array ([id] => 24 [type] => 0 [name] => Home [parent] => 0) [1] => Array ([id] => 35 [type] => 0 [name] => Home2 [parent] => 0) [2] => Array ([id] => 25 [type] => 0 [name] => Second Page [parent] => 0))
Как вы можете видеть, данные извлекаются из базы данных. Но повторяющаяся функция show_pages($id,$pages)
не выполняется во втором раунде. Я имею в виду эта часть show_page
функции не выполняется:
foreach($pages[$id] as $page){
print_r('<br> in menu.php foreach ').print_r(htmlspecialchars($page['name']));
echo '<li id="page_'.$page['id'].'"><a href="pages.php?id='.$page['id'].'">';
echo '<ins> </ins>'.htmlspecialchars($page['name']).'</a>';
show_pages($page['id'],$pages);
echo '</li>';
}
In CMS i go to:
http://localhost/cms34/ww.admin/index.php
which requires 'pages.php';
which requires 'header.php' and 'pages/menu.php';
the header.php requires 'admin_libs.php',
which requires require $_SERVER['DOCUMENT_ROOT'].'/cms34/ww.incs/basics.php';
which has __autoload, and DB connection functions.
pages/menu.php
показан на поставленный выше вопрос. Он получает данные о веб-страницах из таблицы:
$rs=dbAll('select id,type,name,parent from pages order by ord,name');
и выполняет повторную функцию для генерации гиперссылок.
Если я скопировать все из pages/menu.php
в cms34\index.php
и PREPEND линии:
//this line included file for DB connention and data retrieving functions
require $_SERVER['DOCUMENT_ROOT'].'/cms34/ww.incs/basics.php';
Гиперссылка генерируется и рецидивирующий функция работает. Но если я пытаюсь использовать код от cms34\ww.admin\pages\menu.php
от CMS, он не работает.
То, что вы разместили здесь, - это беспорядок для людей, чтобы распутать. Пожалуйста, уменьшите его до [** минимального **, полного и проверяемого примера] (http://stackoverflow.com/help/mcve) проблемы, с большим упором на * минимальный *. –