|
|
Я когда-то это сделал так:
Назовем "перелопачивание контекста с использованием стека"...
По времени с рекурсией не сопоставлял, но тормозов никогда не видел. (Правда, деревья с очень большим числом веток и не строил, но про 200 тормозов не было).
Вставляю as is (без комментариев - надеюсь разберетесь ;-))
В результате - "правильно рассортированный" контекст с индикатором уровня вложенности.
В @main позвать ^macro[go], потом променюшить контекст с учетем ^item[level]
@go
#########################################
^macro[stack_init]
^macro[server;
^context[sorted_messages;
^config[named;message_id parent_id thread_id posted subject name level]
]
^context[messages;
^sql[select
message_id,
parent_id,
thread_id,
date_format(posted, '%d-%m %H:%i') as posted,
subject,
name
from forum
where thread_id=^form[thread]
order by thread_id desc, parent_id, posted]
^var[parent_id;0]
^var[context_isnt_empty;1]
^while[^var[context_isnt_empty];
^empty[^var[context_isnt_empty;0];
^locate[parent_id;^var[parent_id]]
^eq[^item[parent_id];^var[parent_id];
^context[sorted_messages;
^config[append;^item[messages;message_id] ^item[messages;parent_id] ^item[messages;thread_id] ^item[messages;posted] ^item[messages;subject] ^item[messages;name] ^macro[stack_depth]]
]
^macro[stack_push;^var[parent_id]]
^var[parent_id;^item[message_id]]
^config[remove;^item[current]]
;
^var[parent_id;^macro[stack_pop]]
]
]
]
]
]
@stack_init
#########################
^context[stack;^config[named;value]]
@stack_depth
#########################
^context[stack;^if[^item[count];^item[count];0]]
@stack_push
#########################
^context[stack;^config[insert;0;$1]]
@stack_pop
#########################
^context[stack;^item[value]^config[remove;0]]
|