Я переопределил тему представления. точнее одного из полей которое выводит число
отдельно написал функцию
Коротая должна просклонять суффикс этого числа
то есть сейчас у меня есть переменная $output
и вот такая функция
<?php
function declOfNum($n, $titles) {
return $titles[($n % 10 === 1 && $n % 100 !== 11) ? 0 : $n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? 1 : 2];
}
?>
для того чтобы вместе с числом выводился и суффикс, в нужном склонении я вначале файла темы определяю эту функцию
а потом ниже обращаюсь к ней
<?php
function declOfNum($n, $titles) {
return $titles[($n % 10 === 1 && $n % 100 !== 11) ? 0 : $n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? 1 : 2];
}
print $output.' '.declOfNum($output, ['день','дня','дней']);
?>
но выходит ошибка:
Fatal error: Cannot redeclare declOfNum() (previously declared in....
в общем я понимаю что идет перебор строк и система ругается что эта функция уже определена в предыдущей строке.
Но как все таки мне объявить эту функцию один раз, и так чтобы одна была доступна из файла темы?
Комментарии
Ругается на то, что данная ф-ция уже объявлена в системе, и Вы ее 2й (или более) раз объявляете.
Именуйте ф-ции более безопасно, общепринятой практикой является включение названия модуля / темы / библиотеки в имя функции, а также, исходя из названия ф-ции, должен быть понятен ее смысл.
Это я и написал в своем вопросе. Вопрос в том где объявить функцию чтобы она была доступна из файла темы этого поля, но при этом не повторялась и система не ругалась на нее
Функции могут объявляться в модулях, библиотеках и теме. Там где она логически должна быть - там и объявить.
в данном случае я темизирую представление. соответственно в теме ее и объявляю но система ругается что функция была объявлена ранее. Так в каком файле все таки объявить эту функцию чтобы при вызове из файла темы представления она была доступна?
пробовал написать эту функцию в файле который отвечает за "Вывод отображения" и обращаться из файла Поле "Глобальный: Пользовательский текст (ID: nothing)" но функция из него недоступна.
я не прошу решать за меня. тут уже и так все решено нужно только знать куда вписать
Зачем Вы ее объявляете, если она уже объявлена?
Или объявляйте один раз, или объявляйте с другим именем.
она не объявлена. Я ее объявляю в файле темы поля. Но поскольку в представлении идет построчный вывод всех элементов то на следующей итерации система видит что функция была объявлена ранее в предыдущем элементе.
изначально файл содержал только <?print $output?>
но это не значит что выведется только один элемент, выводится столько элементов сколько указано в настройках представления.
Так вот в этом файле (теме отдельного поля) я дописал функцию и если бы у меня на страницу выводился только один элемент то конфликтов может быть и не было бы. так как функция объявлялась один раз. Но элементов несколько...
В общем задача сводится к тому, чтобы просклонять одно из полей в представлении, я решил это сделать в теле поля с помощью функции
Вы функцию в цикле объявляете что ли?
Для работы с темой - файл template.php.
Объявление ф-ций в файлах шаблонов - высшей степени порнуха.
Объявление ф-ций в файлах шаблонов, в цикле - прогрессивно увеличивает степень порнушности с каждой итерацией.
Ну и про format_plural не помешало бы почитать, чтобы не городить собственных велосипедов.
я так понял эта функция подходит только для единственного множественного числа?
но в русском языке 1 день 11 дней и 21 снова день... поэтому и написал свою. Возможно ошибаюсь и эту функцию можно как то расширить
Не надо расширять, все работает.
что то странно.. поставил выходное значение в функцию и она правильно склоняет но только числительные
"от 1 дня"
"от 11 дней"
"от 21 дня"
то есть когда используется всего два слова ($singular, $plural) интересно как добавить третье в эту функцию. или уже нужна своя?
Что такое файл темы поля?
Это шаблон называется. А под файлами темы обычно принято понимать файлы, в которых объявлен hook_theme и/или препроцесс.