Перейти к содержимому


Партнерская программа Kredov

  • Закрытая тема Тема закрыта

Запрос для рекурсивной функции

#11 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0
0

Отправлено 26 Июль 2010 - 12:07

тебе нужно сделать примерно так: создание древовидного меню


А ты точно уверен, что это та тема? =))

А данный запрос нужен, чтобы назначение прав отображалось иерархически. Как-то же должны знать, от какого модуля идут подмодули.
  • 0

#12 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 26 Июль 2010 - 22:11

gaaarfild, тема похожа, там вытаскивается древовидное меню, строится безмерный массив. Тебе же можно всё и в одну гребенку пихнуть.
Я тебе предложил запрос для списка модулей и подмодулей двухуровневого списка. Если надо больше, тот тут без рекурсивной функции php не обойтись, если не получается её написать, помогу, ты только скажи :)
  • 0

#13 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 27 Июль 2010 - 00:15

А я о чем? )) Я ж написал рекурсивную. Но вот она и не работала с моим запросом. Но я ее крайне неправильно написал.

Помоги, а? =)
  • 0

#14 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 27 Июль 2010 - 00:50

Вот метод на javascript:

public function right_list($user_id, $parentid=0) {
global $db, $prefix, $config;
$result = $db->sql_query("SELECT a.id, a.module, a.title, a.rights, a.parent, b.read, b.add, b.edit, b.delete, b.right, b.seer, b.coord, b.search, b.download, b.upload FROM ".$prefix."_modules AS a, ".$prefix."_mod_access AS b WHERE b.uid=".$user_id." AND a.id=b.mid AND a.parent=".$parentid." ORDER BY a.title");
//print_r($db->sql_error());
echo "<form action='java script:;' method='post' id='right_form' >";
while(list($aid, $amodule, $atitle, $arights, $aparent, $bread, $badd, $bedit, $bdelete, $bright, $bseer, $bcoord, $bsearch, $bdownload, $bupload) = $db->sql_fetchrow($result)) {
if(Users::is_right($amodule)) {
if($atitle!='0') {
$aright = explode(',', $arights);
$bread1 = ($bread) ? "<input type='checkbox' name='read_$aid' checked='checked'/> <b>".__READING."</b><br />" : "<input type='checkbox' name='read_$aid' /> <b>".__READING."</b><br />";
$bread1 = ($aright[0] == 1) ? $bread1 : "";
$badd1 = ($badd) ? "<input type='checkbox' name='add_$aid' checked='checked'/> <span style='color: #00cc00; font-weight:bold;'>".__ADDING."</span><br />" : "<input type='checkbox' name='add_$aid' /> <span style='color: #00cc00; font-weight:bold;'>".__ADDING."</span><br />";
$badd1 = ($aright[1] == 1) ? $badd1 : "";
$bedit1 = ($bedit) ? "<input type='checkbox' name='edit_$aid' checked='checked'/> ".__EDITING."<br />" : "<input type='checkbox' name='edit_$aid' /> ".__EDITING."<br />";
$bedit1 = ($aright[2] == 1) ? $bedit1 : "";
$bdelete1 = ($bdelete) ? "<input type='checkbox' name='delete_$aid' checked='checked'/> <span style='color: #cc0000; font-weight:bold;'>".__DELETING."</span><br />" : "<input type='checkbox' name='delete_$aid' /> <span style='color: #cc0000; font-weight:bold;'>".__DELETING."</span><br />";
$bdelete1 = ($aright[3] == 1) ? $bdelete1 : "";
$bright1 = ($bright) ? "<input type='checkbox' name='right_$aid' checked='checked'/> <span style='color: #FF9900; font-weight:bold;'>".__RIGHTS_CHANGING."</span><br />" : "<input type='checkbox' name='right_$aid' /> <span style='color: #FF9900; font-weight:bold;'>".__RIGHTS_CHANGING."</span><br />";
$bright1 = ($aright[4] == 1) ? $bright1 : "";
$bseer1 = ($bseer) ? "<input type='checkbox' name='seer_$aid' checked='checked'/> <b>".__SEERING."</b><br />" : "<input type='checkbox' name='seer_$aid' /> <b>".__SEERING."</b><br />";
$bseer1 = ($aright[5] == 1) ? $bseer1 : "";
$bcoord1 = ($bcoord) ? "<input type='checkbox' name='coord_$aid' checked='checked'/> ".__COORDINATING."<br />" : "<input type='checkbox' name='coord_$aid' /> ".__COORDINATING."<br />";
$bcoord1 = ($aright[6] == 1) ? $bcoord1 : "";
$bsearch1 = ($bsearch) ? "<input type='checkbox' name='search_$aid' checked='checked'/> ".__SEARCHING."<br />" : "<input type='checkbox' name='search_$aid' /> ".__SEARCHING."<br />";
$bsearch1 = ($aright[7] == 1) ? $bsearch1 : "";
$bdownload1 = ($bdownload) ? "<input type='checkbox' name='download_$aid' checked='checked'/> ".__DOWNLOADING."<br />" : "<input type='checkbox' name='download_$aid' /> ".__DOWNLOADING."<br />";
$bdownload1 = ($aright[8] == 1) ? $bdownload1 : "";
$bupload1 = ($bupload) ? "<input type='checkbox' name='upload_$aid' checked='checked'/> ".__UPLOADING."<br />" : "<input type='checkbox' name='upload_$aid' /> ".__UPLOADING."<br />";
$bupload1 = ($aright[9] == 1) ? $bupload1 : "";
if(file_exists('modules/'.$amodule.'/lang/'.$_SESSION['lang'].'_m.php')) {
include('modules/'.$amodule.'/lang/'.$_SESSION['lang'].'_m.php');
}
echo "<div class='dialogue' style='width: 500px;'>
<div class='dialogue_head' id='head$aid' style='CURSOR:pointer;' onclick=\"toggle_pan('#open$aid', '#head$aid', 'dialogue_head_o');\">".$module_menu_title."</div>
<div id='open$aid' style='display:none;'>".$bread1, $bsearch1, $badd1, $bedit1, $bdelete1, $bright1, $bseer1, $bcoord1, $bdownload1, $bupload1."</div>
</div><br />";
unset($module_menu_title);
}
}
$this->right_list($user_id, $aparent);
}
echo "<div id='right_ans'></div><br /><input type='submit' value='".__SAVE."' onclick=\"ajax_get('#right_form', 'mod=users&do=RightsEditSave&uid=".intval($_GET['uid'])."', '#right_ans'); return false;\" />
<span style='display:none;' class='loading'><img src='includes/templates/images/loader_s.gif' alt='".__LOADING."' /></span>
</form>";

}


Вот я его запускаю.

$templ->right_list(intval($_GET['uid']), 0);


Все зависает всерьез и надолго. В чем моя ошибка?
  • 0

#15 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 27 Июль 2010 - 15:30

gaaarfild, а ты простым дебаггом не пробовал? распечатай id и parent рядышком, если зацикливается, увидишь где.
Возможно у тебя в данных путаница, и подмодулю назначен parent один из его дочерних. Тут будет бесконечный цикл.

Возможно ещё ошибка в Users::is_right($amodule), у тебя не расписано, что она делает. Так визуально ошибок нету, всё должно работать. SQL-запрос написан правильно.
  • 0

#16 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 27 Июль 2010 - 18:18

Users::is_right($amodule) возвращает только true или false.

Все подмодули назначены верно. А что за дебаггер?
  • 0

#17 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 27 Июль 2010 - 21:24

gaaarfild, да просто выводить значения id и parent с помощью echo, и посмотреть где зацикливается. Вот тебе и простой дебаггер :)
  • 0

#18 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 27 Июль 2010 - 21:35

А, ну да! =))) Да он и зациклиться не может. Я одному только задал parent. Остальные все с нулями. И он точно сам на себя не замыкается. =)
  • 0

#19 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 27 Июль 2010 - 21:57

gaaarfild, а что выводит? Может ещё до этого места зацикливается? Не оставили ли где в коде прорехи?
  • 0

#20 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 28 Июль 2010 - 09:28

Вроде бы все работает, но в каждом модуле теперь он загружает не дочерние, а все модули.

Интересно, если добавить DISTINCT, будет лучше?
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru