Как объявить и обратиться к функции в файле темы представления?

Главные вкладки

Аватар пользователя engenes engenes 21 октября 2018 в 13:10

Я переопределил тему представления. точнее одного из полей которое выводит число
отдельно написал функцию
Коротая должна просклонять суффикс этого числа
то есть сейчас у меня есть переменная $output
и вот такая функция

<?php
    
function declOfNum($n$titles) { 
        return 
$titles[($n 10 === && $n 100 !== 11) ? $n 10 >= && $n 10 <= && ($n 100 10 || $n 100 >= 20) ? 2]; 
    } 
?>

для того чтобы вместе с числом выводился и суффикс, в нужном склонении я вначале файла темы определяю эту функцию
а потом ниже обращаюсь к ней

<?php
function declOfNum($n$titles) { 
    return 
$titles[($n 10 === && $n 100 !== 11) ? $n 10 >= && $n 10 <= && ($n 100 10 || $n 100 >= 20) ? 2]; 

print 
$output.' '.declOfNum($output, ['день','дня','дней']);
?>

но выходит ошибка:

Fatal error: Cannot redeclare declOfNum() (previously declared in....

в общем я понимаю что идет перебор строк и система ругается что эта функция уже определена в предыдущей строке.
Но как все таки мне объявить эту функцию один раз, и так чтобы одна была доступна из файла темы?

Лучший ответ

Аватар пользователя bumble bumble 21 октября 2018 в 14:08

Для работы с темой - файл template.php.
Объявление ф-ций в файлах шаблонов - высшей степени порнуха.
Объявление ф-ций в файлах шаблонов, в цикле - прогрессивно увеличивает степень порнушности с каждой итерацией.

Комментарии

Аватар пользователя bumble bumble 21 октября 2018 в 13:24

Ругается на то, что данная ф-ция уже объявлена в системе, и Вы ее 2й (или более) раз объявляете.

Именуйте ф-ции более безопасно, общепринятой практикой является включение названия модуля / темы / библиотеки в имя функции, а также, исходя из названия ф-ции, должен быть понятен ее смысл.

Аватар пользователя engenes engenes 21 октября 2018 в 13:41

Это я и написал в своем вопросе. Вопрос в том где объявить функцию чтобы она была доступна из файла темы этого поля, но при этом не повторялась и система не ругалась на нее

Аватар пользователя bumble bumble 21 октября 2018 в 13:44

Функции могут объявляться в модулях, библиотеках и теме. Там где она логически должна быть - там и объявить.

Аватар пользователя engenes engenes 21 октября 2018 в 13:57

в данном случае я темизирую представление. соответственно в теме ее и объявляю но система ругается что функция была объявлена ранее. Так в каком файле все таки объявить эту функцию чтобы при вызове из файла темы представления она была доступна?
пробовал написать эту функцию в файле который отвечает за "Вывод отображения" и обращаться из файла Поле "Глобальный: Пользовательский текст (ID: nothing)" но функция из него недоступна.
я не прошу решать за меня. тут уже и так все решено нужно только знать куда вписать

Аватар пользователя bumble bumble 21 октября 2018 в 13:58

Зачем Вы ее объявляете, если она уже объявлена?
Или объявляйте один раз, или объявляйте с другим именем.

Аватар пользователя engenes engenes 21 октября 2018 в 14:06

она не объявлена. Я ее объявляю в файле темы поля. Но поскольку в представлении идет построчный вывод всех элементов то на следующей итерации система видит что функция была объявлена ранее в предыдущем элементе.
изначально файл содержал только <?print $output?>
но это не значит что выведется только один элемент, выводится столько элементов сколько указано в настройках представления.

Так вот в этом файле (теме отдельного поля) я дописал функцию и если бы у меня на страницу выводился только один элемент то конфликтов может быть и не было бы. так как функция объявлялась один раз. Но элементов несколько...
В общем задача сводится к тому, чтобы просклонять одно из полей в представлении, я решил это сделать в теле поля с помощью функции

Аватар пользователя bumble bumble 21 октября 2018 в 14:08

Для работы с темой - файл template.php.
Объявление ф-ций в файлах шаблонов - высшей степени порнуха.
Объявление ф-ций в файлах шаблонов, в цикле - прогрессивно увеличивает степень порнушности с каждой итерацией.

Аватар пользователя engenes engenes 21 октября 2018 в 14:21

я так понял эта функция подходит только для единственного множественного числа?
но в русском языке 1 день 11 дней и 21 снова день... поэтому и написал свою. Возможно ошибаюсь и эту функцию можно как то расширить

Аватар пользователя engenes engenes 21 октября 2018 в 14:28

что то странно.. поставил выходное значение в функцию и она правильно склоняет но только числительные
"от 1 дня"
"от 11 дней"
"от 21 дня"
то есть когда используется всего два слова ($singular, $plural) интересно как добавить третье в эту функцию. или уже нужна своя?

Аватар пользователя gun_dose gun_dose 21 октября 2018 в 15:13

Это шаблон называется. А под файлами темы обычно принято понимать файлы, в которых объявлен hook_theme и/или препроцесс.