<?xml version='1.0' encoding='UTF-8'?>
<rss version='2.0'>
	<channel>
		<title>cotonti.com : [Принято] Предложение по улучшению Структуры категорий</title>
		<link>https://www.cotonti.com</link>
		<description>Neueste Themenbeiträge</description>
		<generator>Cotonti</generator>
		<language>en</language>
		<pubDate>Thu, 09 Apr 2026 18:15:36 -0000</pubDate>

		<item>
			<title>Macik</title>
			<description><![CDATA[<p>В целом, варианты переопределения такого типа мне не нравятся, т.к. они переопределяют функцию целиком, и не дают  возможности дальнейшего расширения или переопределения — особенно в местах аналогичных `cot_mail`, когда один плагин «врезался» в функционал, переопределив функцию, в остальных мы може легко получить либо не предсказуемое поведение, либо, что еще хуже можем получить фатальную ошибку, если другой плагин попробует ее переопределить.</p>

<p>Возвращаясь к теме переопределения структуры — тут вопрос не такой острый, и, пожалуй, это самое простое и быстрое решение. Поэтому пулл-реквест приму, со статусом «экспериментального» (<span style="font-family:'Open Sans', 'Helvetica Neue', Helvetica, sans-serif;font-size:15px;line-height:24px;">до лучших времен, </span>когда этот вопрос будет решен другими метдами, или потребует изменения кода).</p>
]]></description>
			<pubDate>Fr, 18 Mär 2016 11:27:01 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/de/forums?m=posts&q=8035&d=0#post41529]]></link>
		</item>
		<item>
			<title>Yusupov</title>
			<description><![CDATA[<p>В моем варианте как-раз и сделано так чтобы у родителя была опция где хранятся его подкатегории. На одном сайте нашего пользователя было несколько тысяч категорий и именно такой вариант был наиболее жизнеспособный. Инклуды не использовались так как делается все внутри функции, поэтому и возник вопрос реализации более элегантного варианта без изменения исходного кода Cotonti.</p>

<blockquote>
<p>`cot_load_structure_custom()` практически не вариант, т.к. на момент вызова `cot_load_structure()` еще не сработал ни один основной хук и нам просто негде подключить кастомную ф-ю. Единственная возможность это файл `functions.custom.php` при включенной опции `$cfg['customfuncs']`.</p>
</blockquote>

<p style="font-size:15px;">Скорее всего этот вариант наиболее простой на данный момент.</p>

<p>Основная проблема при работе со стандартной функцией cot_load_structure() это невозможность получить список подкатегорий не прибегая к перебору всей структуры снова и снова.</p>

<p>Либо еще один вариант: выводить дерево категорий через ajax, генерируя нужную ветку категорий только тогда, когда она нужна (по какому-либо событию).</p>
<p class="updated"><strong>Добавлено 1 неделя спустя:</strong></p><blockquote class="fp"><a href="https://www.cotonti.com/forums?m=posts&amp;q=8035&amp;d=1#41475">#41475</a> <strong>Macik:</strong><br />
`cot_load_structure_custom()` практически не вариант, т.к. на момент вызова `cot_load_structure()` еще не сработал ни один основной хук и нам просто негде подключить кастомную ф-ю. Единственная возможность это файл `functions.custom.php` при включенной опции `$cfg['customfuncs']`.</blockquote>

<p>Возможно ли добавить замену внутри функции на cot_load_structure_custom() как это сделано с функцией cot_mail? <br />
И если да, то будет ли эта возможность добавлена до релиза 0.9.19?</p>
<p class="updated"><strong>Добавлено 1 день спустя:</strong></p><p>Уважаемые разработчики, посмотрите мой <a href="https://github.com/Cotonti/Cotonti/pull/1499/files" rel="nofollow">pull request</a>.</p>

<p>Добавил замену функции на cot_load_structure_custom().</p>
]]></description>
			<pubDate>Di, 08 Mär 2016 08:49:28 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/de/forums?m=posts&q=8035&d=0#post41480]]></link>
		</item>
		<item>
			<title>Macik</title>
			<description><![CDATA[<p>Да, это все в туже сторону — создание отдельного класса по управлению структурой. Править придется много — более двух сотен вхождений... И еще придется держать слой совместимости какое-то время.</p>
]]></description>
			<pubDate>Mo, 07 Mär 2016 21:28:28 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/de/forums?m=posts&q=8035&d=0#post41477]]></link>
		</item>
		<item>
			<title>Dr2005alex</title>
			<description><![CDATA[<p>Я уже давно использую <span style="background-color:#D3D3D3;">parent_id</span> для структур в своих модулях. Мне кажется для нейтрализации проблемы сжираемой памяти или ресурсов с большим количеством вложений структуры и её элементов, необходимо отказаться от загрузки по умолчанию все структуры в массив. Я лично еще не встречал, где бы приходилось выводить (обрабатывать) сразу всю структуру в несколько сотен или тысяч элементов. Мне кажется надо  модернизировать или создать функцию по выдаче части структуры, необходимой в данный момент. Тогда речь пойдет уже максимум о десятках.. Тогда можно будет передать полноценные права модулю, использующего данную структуру.. надо все? вытягивай и кешируй.. а не надо все вытащи то-что необходимо.</p>

<p>Еще вариант это хранить предков в отдельной сущности или чилдренов.. я использую разные подходы, в зависимости от нужд скрипта..</p>
]]></description>
			<pubDate>Mo, 07 Mär 2016 21:13:28 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/de/forums?m=posts&q=8035&d=0#post41476]]></link>
		</item>
		<item>
			<title>Macik</title>
			<description><![CDATA[<blockquote class="fp"><a href="https://www.cotonti.com/forums?m=posts&amp;q=8035&amp;d=1#41265">#41265</a> <strong>Yusupov: </strong>
<p>Хук тоже хорошее решение. Все остальное можно под себя реализовать в зависимости от сложности проекта. <span style="line-height:20.8px;">Спасибо! </span></p>

<p><span style="line-height:20.8px;">Еще как вариант не плохо бы иметь возможность полностью заменить </span>функцию cot_load_structure() на cot_load_structure_custom() при ее наличии.</p>

<p> </p>
</blockquote>

<p>«Возвращайся сделав круг…»</p>

<ol><li><a href="https://github.com/Cotonti/Cotonti/blob/0.9.18.1/system/functions.php#L1265-L1270" rel="nofollow">Хук внутри</a> функции <a href="https://github.com/Cotonti/Cotonti/blob/0.9.18.1/system/functions.php#L1208" rel="nofollow">у нас имеется</a> — `structure`. Но это проблема, для структур в несколько тысяч записей, т.к. директива `include`в таком цикле может легко скушать несколько секунд.</li>
	<li>`<strong><span style="color:rgb(119,119,119);font-family:'Open Sans', 'Helvetica Neue', Helvetica, sans-serif;font-size:15px;line-height:24px;">cot_load_structure_custom()</span></strong>` практически не вариант, т.к. на момент вызова `<span style="color:rgb(119,119,119);font-family:'Open Sans', 'Helvetica Neue', Helvetica, sans-serif;font-size:15px;line-height:24px;">cot_load_structure()</span>` еще не сработал ни один основной хук и нам просто негде подключить кастомную ф-ю. Единственная возможность это файл `functions.custom.php` при включенной опции `$cfg['customfuncs']`.</li>
</ol><p>Ваши мнения? </p>

<p> </p>
]]></description>
			<pubDate>Mo, 07 Mär 2016 19:29:58 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/de/forums?m=posts&q=8035&d=0#post41475]]></link>
		</item>
		<item>
			<title>Yusupov</title>
			<description><![CDATA[<blockquote><a href="https://www.cotonti.com/forums?m=posts&amp;q=8035&amp;d=1#41267">#41267</a> <strong>esclkm: </strong><br />
Как бы ничего не мешает в global пройтись по массиву. </blockquote>

<p>Ну это уже совсем неприемлимо) </p>

<p> </p>

<p>Конечно, ни тот ни другой из озвученных здесь способов не идеальны, всегда будет что-то чем придётся жертвовать. </p>

<p>Лично мое мнение, структура не должна быть частью ядра. Но раз уж так завелось, то хотелось бы, чтобы ее применение было более гибким.</p>
]]></description>
			<pubDate>So, 27 Dez 2015 13:31:16 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/de/forums?m=posts&q=8035&d=0#post41268]]></link>
		</item>
		<item>
			<title>esclkm</title>
			<description><![CDATA[Как бы ничего не мешает в global пройтись по массиву. Хук ради хука тоже как бы... не айс.. Хотя пусть будет]]></description>
			<pubDate>So, 27 Dez 2015 05:33:01 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/de/forums?m=posts&q=8035&d=0#post41267]]></link>
		</item>
		<item>
			<title>Yusupov</title>
			<description><![CDATA[<p>Хук тоже хорошее решение. Все остальное можно под себя реализовать в зависимости от сложности проекта. <span style="line-height:20.8px;">Спасибо! </span></p>

<p><span style="line-height:20.8px;">Еще как вариант не плохо бы иметь возможность полностью заменить </span>функцию cot_load_structure() на cot_load_structure_custom() при ее наличии.</p>

<p> </p>
]]></description>
			<pubDate>Sa, 26 Dez 2015 19:19:55 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/de/forums?m=posts&q=8035&d=0#post41265]]></link>
		</item>
		<item>
			<title>Macik</title>
			<description><![CDATA[<blockquote><a href="https://www.cotonti.com/forums?m=posts&amp;q=8035&amp;d=1#41261">#41261</a> <strong>Ярослав Романенко:</strong>
<blockquote> </blockquote>

<p>Говорим об памяти и быстродействии и пихаем обьект ? Я конечно не спец в этой области но кажется мешать ООП и то что есть не самая лучшая идея.  Или отказываться в котонти от легкости и переходить на полноценный ООП а то будет шопопало имхо </p>
</blockquote>

<p>Я бы не был так категоричен. Мнение, что объекты или ООП в целом, это медлено и жрет память, то же самое что сказать, что массивы в ПХП не оптимальны и <a href="http://habrahabr.ru/post/141093/" rel="nofollow">потребляют от 80 до 140 байт</a> на описание одного элемента. Это правда. Но вопрос в том, как это использовать...<br /><br />
Если каждую запись делать объектом, да еще поиметь оверхед на инициализацию и прочее — то да, это как раз пример «ООП это тормоз и жрет память».</p>

<p>В данном случае речь идет лишь об объекте-обертке с набором удобных функций для обработки (и внутренним предствалением данных, оптимизированных для скорости). <br />
Такой подход позволит в будущем расширять и оптимизировать функционал, без необходимости перекраивать код во многих местах.<br />
Если еще воспользоваться <a href="http://php.net/manual/ru/spl.datastructures.php" rel="nofollow">структурами данных SPL</a>, то вероятно можно дополнительно сэкономить и на потребляемой пямяти.<br /><br />
Мы же используем сейчас объекты для доступа к БД, кеша, шаблонов. Потому, что при грамотной реализации это удобнее в использовании и оптимальнее с точки зрения кода.</p>

<p>---</p>

<p>Резюмируя...</p>

<p>Я не приветствую расширение текущей структуры данных. Тем более, когда речь идет о  работе с многотысячной структурой категорий. Как минимум, это пагубно скажется на расходе памяти.</p>

<p>Возможно сейчас, как «быстрое решение», имеет смысл добавить <span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;color:rgb(68,68,68);font-family:sans-serif;line-height:20.8px;background:rgb(238,238,238);">хуки</span><span style="color:rgb(68,68,68);font-family:sans-serif;line-height:20.8px;background-color:rgb(238,238,238);"> в cot_load_structure()</span> .</p>

<p>В целом согласен с <strong>Esclkm</strong> в том, что текущая реализация не оптимальна и нуждается в переарботке.</p>

<p> </p>
]]></description>
			<pubDate>Sa, 26 Dez 2015 13:52:54 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/de/forums?m=posts&q=8035&d=0#post41263]]></link>
		</item>
		<item>
			<title>CrazyFreeMan</title>
			<description><![CDATA[<blockquote><a href="https://www.cotonti.com/forums?m=posts&amp;q=8035&amp;d=1#41255">#41255</a> <strong>esclkm: </strong>

<p> </p>

<p>Я считаю, что все аспекты работы со структурой должны быть перенесены в объект</p>
</blockquote>

<blockquote><a href="https://www.cotonti.com/forums?m=posts&amp;q=8035&amp;d=1#41260">#41260</a> <strong>esclkm: </strong>

<p> </p>

<p>надо сделать в виде класса</p>
</blockquote>

<p><img alt="crying" height="23" src="https://www.cotonti.com/plugins/ckeditor/lib/plugins/smiley/images/cry_smile.png" title="crying" width="23" /></p>

<p>Говорим об памяти и быстродействии и пихаем обьект ? Я конечно не спец в этой области но кажется мешать ООП и то что есть не самая лучшая идея.  Или отказываться в котонти от легкости и переходить на полноценный ООП а то будет шопопало имхо </p>
]]></description>
			<pubDate>Do, 24 Dez 2015 16:02:34 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/de/forums?m=posts&q=8035&d=0#post41261]]></link>
		</item>
		<item>
			<title>esclkm</title>
			<description><![CDATA[<p>нет - не то, чтобы он не подходит. просто он не идеален. и имеет вопросы. Я просто думаю что это надо сделать в виде класса в котором делать встроенные навигационные массивы, чтобы находить информацию быстро. не более того. Я в целом считаю, что наш текущий способ для интерпретации даже требует много времени</p>
]]></description>
			<pubDate>Do, 24 Dez 2015 07:07:35 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/de/forums?m=posts&q=8035&d=0#post41260]]></link>
		</item>
		<item>
			<title>Yusupov</title>
			<description><![CDATA[<p>Например предложенный мною вариант использовался для сайта, где категорий несколько тысяч и много уровней вложенности. Когда вместо этого я использовал cot_structure_children(), то сервер просто лежал. Разница в скорости очевидна, так как мы используем уже готовые списки подкатегорий из кэша вместо постоянного повторяющегося перебора. </p>

<p>Если вариант не подходит, то как минимум предлагаю прописать<span style="line-height:20.8px;"> хуки</span> в cot_load_structure(), чтобы не приходилось постоянно писать костыли под свои задачи.</p>
]]></description>
			<pubDate>Mi, 23 Dez 2015 16:46:51 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/de/forums?m=posts&q=8035&d=0#post41257]]></link>
		</item>
		<item>
			<title>esclkm</title>
			<description><![CDATA[<p>Это исправление вызывает странное послевкусие.</p>

<p>Вроде все так, но не так. Увеличился объем занимаемой памяти самой структуры.</p>

<p>При этом от рекурсии мы не избавились? я про то, что дочерние, дочерних, что с ними?</p>

<p>Скорость - об этом тоже ни слова. Плюс почему исправление только в load_structure? что с get_children?</p>

<p>Я считаю, что все аспекты работы со структурой должны быть перенесены в объект</p>

<p>А информация о детях и их родителях в массиве в объекте</p>

<p> </p>
]]></description>
			<pubDate>Mi, 23 Dez 2015 14:55:09 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/de/forums?m=posts&q=8035&d=0#post41255]]></link>
		</item>
		<item>
			<title>Macik</title>
			<description><![CDATA[<p>Как дойдут руки — глану и напишу мнение. Пока не смотрел.</p>
]]></description>
			<pubDate>Di, 22 Dez 2015 15:15:00 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/de/forums?m=posts&q=8035&d=0#post41253]]></link>
		</item>
		<item>
			<title>Yusupov</title>
			<description><![CDATA[<p>Генерируемый массив категорий в Cotonti недостаточно гибкий для более удобного использования. Например для генерации многоуровневого дерева категорий наряду с рекурсией приходится прибегать к сложным алгоритмам. А если категорий очень много, то это неизбежно создает большую нагрузку на сервер.</p>

<p>Предлагаю добавить в генерируемый массив категорий значение subcats, в котором будет формироваться массив подкатегорий для конкретной категории. Опыт использования такого подхода в сборке <a href="https://cmsworks.ru/apps/freelance2" rel="nofollow">фриланс-биржи</a> показал хорошие результаты. </p>

<p>Код измененной функции cot_load_structure() можно посмотреть тут: <a href="https://github.com/cmsworksru/cot-freelance/blob/52ce4f903035abef8c90d431f1e695a9f8617fd7/system/functions.php#L1197" rel="nofollow">https://github.com/cmsworksru/cot-freelance/blob/52ce4f903035abef8c90d431f1e695a9f8617fd7/system/functions.php#L1197</a></p>

<p>В частности добавлены следующие строки: </p>

<p><a href="https://github.com/cmsworksru/cot-freelance/blob/52ce4f903035abef8c90d431f1e695a9f8617fd7/system/functions.php#L1233" rel="nofollow">https://github.com/cmsworksru/cot-freelance/blob/52ce4f903035abef8c90d431f1e695a9f8617fd7/system/functions.php#L1233</a><br /><a href="https://github.com/cmsworksru/cot-freelance/blob/52ce4f903035abef8c90d431f1e695a9f8617fd7/system/functions.php#L1278-L1284" rel="nofollow">https://github.com/cmsworksru/cot-freelance/blob/52ce4f903035abef8c90d431f1e695a9f8617fd7/system/functions.php#L1278-L1284</a></p>

<p> </p>
]]></description>
			<pubDate>Sa, 19 Dez 2015 08:33:20 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/de/forums?m=posts&q=8035&d=0#post41252]]></link>
		</item>
	</channel>
</rss>