Недокументированные функции NetCat 4.72
На днях пришлось поковыряться в исходниках NetCat 4.72, и по дороге обнаружились некоторые любопытные функции, о существовании которых мы не знали. И неудивительно, поскольку они не описаны в документации. Некоторые наиболее полезные собраны в этом посте.
Получить список подразделов раздела
- /**
- * Получить идентификаторы всех подразделов раздела с идентификатором $sub
- * @param int $sub идентификатор родительского раздела
- * @return array массив с идентификаторами подразделов
- *
- */
- function nc_get_sub_children($sub) {
- global $db;
- $array[] = $sub;
- $sub_array = $db->get_col("SELECT `Subdivision_ID` FROM `Subdivision` WHERE Parent_Sub_ID = '".intval($sub)."'");
- if (!empty($sub_array)) {
- foreach ($sub_array AS $key => $val) {
- $array = array_merge($array, nc_get_sub_children($val));
- }
- }
- return $array;
- }
Визуализация массива
- /**
- * Вывод массива в структурированном виде
- * @param array массив для вывода
- * @return bool true;
- */
- function dump($var) {
- print "<hr><xmp>".print_r($var, 1)."</xmp><hr>";
- return true;
- }
Получить список дочерних макетов дизайна
Эта функция может быть полезна например для сайта с шаблонами NetCat, чтобы автоматически генерить список ссылок на все шаблоны. Или, скажем, чтобы для любого шаблона делать ссылку на его "мобильную версию", или упрощенную, или красненькую.
- /**
- * Получить идентификаторы всех дочерних макетов для макета с идентификатором $template
- * @param int $template идентификатор родительского макета
- * @return array массив с идентификаторами макетов
- *
- */
- function nc_get_template_children($template) {
- global $db;
- $template = intval($template);
- $array[] = $template;
- $template_array = $db->get_col("SELECT `Template_ID` FROM `Template` WHERE `Parent_Template_ID` = '".$template."'");
- if (!empty($template_array)) {
- foreach ($template_array AS $key => $val) {
- $array = array_merge($array, nc_get_template_children($val));
- }
- }
- return $array;
- }
Падежи для существительных
- /*
- * @quantity int число для которого выводим склонение
- * @arForms array массив форм слова формата (единственное число, двойственное, множественное), например array('этаж','этажей','этажа') или ('а','','ы') для слова "Квартир".nc_numeral_inclination(20, array('этаж','этажей','этажа') )
- */
- function nc_numeral_inclination($quantity, $arForms) {
- $string = strval($quantity);
- $len = strlen($string);
- if ($len > 1) {
- $prev_last_digit = $string[$len - 2];
- } else {
- $prev_last_digit = 0;
- }
- $last_digit = $string[$len - 1];
- if ($last_digit == 1 && $prev_last_digit != 1) {
- return $arForms[0];
- }
- if ($last_digit == 0 || ($prev_last_digit == 1 && $last_digit == 1) || (($prev_last_digit == 1)) || ($last_digit >= 5 && $last_digit <= 9)) {
- return $arForms[1];
- }
- if (($last_digit >= 2 && $last_digit <= 4) && !($quantity >= 11 && $quantity < 20)) {
- return $arForms[2];
- }
- }
Это - рекурсивный вызов функции. Все подразделы данного раздела попадают в одномерный массив. Только вот с последовательностью видимо будут нелады - сначала первый уровень вложенности, потом - вложенные в первый не пустой раздел, потом во второй, и т.д., потом третий уровень вложенности начиная с первого непустого второго... В общем, изрядная каша :)
Finar.