С Новым годом! Форум программистов, компьютерный форум, киберфорум
1С Битрикс
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 1
Регистрация: 28.11.2020
Сообщений: 110

Не видно макросы из init.php

08.11.2025, 13:14. Показов 1096. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На сертификации столкнулся с проблемой - определив API названия инфоблоков, различные id и т.п., я не смог воспользоваться этими макросами ни напрямую в result_modifier.php для компонента news.list, ни в файле класса для задач из экзамена. Я создавал init.php в "local/php_interface/init.php". В общем я так и не понял, в чем была проблема, init.php точно работал, т.к. на главной странице сайта макросы выводились. В моем локальном проекте для подготовки все работает как надо, макросы видны везде, где мне нужно.

Еще ко мне пришла мысль, что init может быть свой для каждого сайта, но это в том случае, если создавать его в папке с названием сайта, чего я не делал.

Еще вспомнил, что я создал define прям в файле класса, и макрос все равно был пустой
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.11.2025, 13:14
Ответы с готовыми решениями:

ошибка в init.php
Друзья специалисты, вообщем проблема такая, установил я себе форум LogicBoard на dle 10.1, после...

Рухнул сайт после редактирования init.php
Друзья, по неопытности сделал ошибку в файле /bitrix/php_interface/init.php. редактировал его...

Событие init.php на добавление пользователя
Как называется событие на добавление пользователя, необходимо в init перехватить этот момент и...

13
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,449
Записей в блоге: 2
08.11.2025, 17:43
Что за макросы? Можете привести пример?

Пока единственная мысль: что вы столкнулись с работой кеширования и не учли это.

Может вы имеете ввиду именованную константу? Тогда надо знать как именно вы ее используете в result-modifier и какой результат ожидаете
0
1 / 1 / 1
Регистрация: 28.11.2020
Сообщений: 110
08.11.2025, 20:09  [ТС]
Да, под макросами я имел ввиду define, я программировал на C++, там define назывался так. Кэш я практически сразу же сбросил как только увидел, что константа выводится без значения, ничего не поменялось. При этом, как я написал в конце первого поста, насколько помню, я решил определить константу прямо в файле класса, но это не изменило проблемы. Я использую константу как API-имя инфоблока, для следующей функции:
PHP
1
2
3
4
5
6
7
use \Bitrix\Main\Loader;
Loader::includeModule("iblock");
 
function getIBRuntimeClassName(string $IBName): string
{
    return "\\Bitrix\\Iblock\\Elements\\Element" . $IBName . "Table";
}
На экзамене я получал ошибку "\Bitrix\Iblock\Elements\ElementTabl e" не найден, то есть константа не определена и подставляется пустая строка между Element и Table

Добавлено через 30 минут
Ну и константы, которые были интом давали такое же поведение, то есть от типа это не зависело
0
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,449
Записей в блоге: 2
09.11.2025, 10:32
Ну инт в данную конструкцию точно подставлять нет необходимости. Вопрос скорее всего с Битрикс ни как не связан. Особенно если учесть, что вы даже в самом классе задавали и это "не помогло". Это про понимание PHP. Покажите как задали константу в init.php и как ее подставляете. По хорошему, у меня есть такое подозрение, что вообще что то не то пишите там. Для чего вы это делаете в result_modifier ?

В данном случае приведенный код вообще ни как не проливает свет на то как вы это используете. И создаете.

На всякий случай уточню, что константы можно задавать только один раз (одну и ту же). Т.е. если у вас где то на пути жизненного цикла хита стоит, например, define('MY_CONST',''); то он так и будет далее иметь это значение. А при попытке повторно ее задать у вас будет 'PHP Warning: Constant MY_CONST already defined' если у вас погашен вывод варнингов - проверьте нет ли подобных записей в логах.

К слову есть такая конструкция

PHP
1
2
3
4
5
$iblock = 'MY_IB_API_CODE';
$elementEntity = \Bitrix\Iblock\IblockTable\IblockTable::compileEntity($iblock);
$elementDataClass = $elementEntity->getDataClass();
$query = $elementDataClass::query();
// и дальше работаем с запросом
PS Макросов тут нет в понимании плюсов. Ведь там в макросах можно создавать целую конструкцию. В пхп это именно константы.

Добавлено через 6 минут
Единственное что смущает - что "локально работает, а там нет". Нет ли режима мультисайтовости "там". Возможно для разных сайтов каталоги local физически разные (у меня на большинстве проектов с мультисайтовостью - это один и тот же каталог, но не всегда так делают)

Файл init.php подключается так
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (($_fname = getLocalPath("init.php")) !== false)
{
    include_once $_SERVER["DOCUMENT_ROOT"] . $_fname;
}
 
if (($_fname = getLocalPath("php_interface/init.php", BX_PERSONAL_ROOT)) !== false)
{
    include_once $_SERVER["DOCUMENT_ROOT"] . $_fname;
}
 
if (($_fname = getLocalPath("php_interface/" . SITE_ID . "/init.php", BX_PERSONAL_ROOT)) !== false)
{
    include_once $_SERVER["DOCUMENT_ROOT"] . $_fname;
}
При этом, по логике getLocalPath, приоритет за local а во вторую очередь bitrix
0
1 / 1 / 1
Регистрация: 28.11.2020
Сообщений: 110
09.11.2025, 12:32  [ТС]
Цитата Сообщение от voral Посмотреть сообщение
Покажите как задали константу в init.php и как ее подставляете. Для чего вы это делаете в result_modifier ?
init.php:
PHP
1
2
3
4
5
<?php
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
define("IBLOCK_ID_REVIEWS", "5");
define("IBLOCK_CODE_REVIEWS", "IBReviews");
//далее там обработчики событий
Затем в другом файле, в методе класса, делаю так:
PHP
1
2
$IBReviews = getIBRuntimeClassName(IBLOCK_CODE_REVIEWS); // по заданию имена и id нельзя указывать напрямую
$authorId = $IBReviews::getList([ // ну и дальше условия выборки
Насчет result_modifier - там я собирался вызвать нужные методы из созданного класса, чтобы по заданию модифицировать результат компонента, но поскольку ничего не работало, я и там ради интереса выводил значение константы. Ну и еще у меня возникла мысль, что я чего-то не понимаю в порядке выполнения страниц.


Цитата Сообщение от voral Посмотреть сообщение
На всякий случай уточню, что константы можно задавать только один раз (одну и ту же)
Я определяю их единожды в init.php, просто для теста я засунул ее сразу в файл где описывал класс.


Цитата Сообщение от voral Посмотреть сообщение
Единственное что смущает - что "локально работает, а там нет". Нет ли режима мультисайтовости "там".
Об этом я тоже думал, и у битрикса на экзаменационном сервере, кажется, и правда есть несколько сайтов, но в этом случае, как вы указали, надо явно задать директорию для init под конкретный сайт, а я создал просто по пути "local/php_interface/init.php". Он ведь должен отрабатывать для всех сайтов ?
0
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,449
Записей в блоге: 2
09.11.2025, 14:29
Цитата Сообщение от Avgust Pier Посмотреть сообщение
а я создал просто по пути "local/php_interface/init.php". Он ведь должен отрабатывать для всех сайтов ?
Тут есть тонкость. По умолчанию (при создании мультисайтовости на разных доменах) в битрикс окружении символической ссылки на local не создается. Если local физически один для всех сайтов то да. Это можно проверить и в админке: Контент - Структура сайта - Файлы и папки. Здесь, в случая многосайтовости будет два "корня". Тут можно проверить local.

Цитата Сообщение от Avgust Pier Посмотреть сообщение
Насчет result_modifier - там я собирался вызвать нужные методы из созданного класса, чтобы по заданию модифицировать результат компонента
Данные берете из другого инфоблока (не из того что берет данные сам компонент)?

Так без кода конечно сложно гадать. Можно попробовать вставить

Добавлено через 6 минут
код (специально не средствами Битрикс)
PHP
1
2
3
4
5
6
7
8
file_put_contents(
   $_SERVER['DOCUMENT_ROOT'].'/debug.log',
   print_r([
     __FILE__.' '.__LINE__,
     defined('IBLOCK_CODE_REVIEWS') ? IBLOCK_CODE_REVIEWS : 'not defined'
   ],true),
   FILE_APPEND
);
- в init.php после создания константы
- в index.php где подключается ваш компонент (или содержащий его компонент)
- если ваш компонент внутри другого - лучше перед каждым подключением компонента в иерархии
- непосредственно в вашем классе перед использованием.

Может быть очередность что то подскажет....



PS я по опыту использую класс для хранения подобных констант. В зависимости от проекта это либо он в составе отдельного модуля отвечающего за весь проект (и что то вытянуто в настройки в админке), либо просто отдельный класс подключаемый в init.php. Это дает типизацию, не дает опечататься, можно дефолтные значения реализовать для каких то случаев......

Добавлено через 1 минуту
Еще пришла в голову мысль: вы уверены что именно этот шаблон компонента используется в result_modifier.php которого пробуете вносить правки?
0
1 / 1 / 1
Регистрация: 28.11.2020
Сообщений: 110
09.11.2025, 14:58  [ТС]
Цитата Сообщение от voral Посмотреть сообщение
Тут есть тонкость. По умолчанию (при создании мультисайтовости на разных доменах) в битрикс окружении символической ссылки на local не создается. Если local физически один для всех сайтов то да. Это можно проверить и в админке: Контент - Структура сайта - Файлы и папки. Здесь, в случая многосайтовости будет два "корня". Тут можно проверить local.
То есть стоило попробовать создать init.php конкретно для текущего сайта ?


Цитата Сообщение от voral Посмотреть сообщение
Данные берете из другого инфоблока (не из того что берет данные сам компонент)?
Да, задание было такое: есть инфоблок рецензий, надо взять рецензии, соответствующие пользователям, которые фильтруются по определенной группе, и засунуть данные этих рецензий в результат компонента news.list, который берет данные другого инфоблока с новостями.

Цитата Сообщение от voral Посмотреть сообщение
Еще пришла в голову мысль: вы уверены что именно этот шаблон компонента используется в result_modifier.php которого пробуете вносить правки?
Помимо констант я там же писал print_r($arResult) и он выводился перед результатом компонента. Так что думаю да, я использовал нужный шаблон.

Самое непонятное - они же по итогу создавались, т.к. на главной странице их было видно при выводе, значит init отработал если я правильно понимаю. Короче сложилось впечатление, что значение констант определялось под самый конец, после того как отработали страницы с классом и news.list
0
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,449
Записей в блоге: 2
09.11.2025, 15:44
Цитата Сообщение от Avgust Pier Посмотреть сообщение
Короче сложилось впечатление, что значение констант определялось под самый конец, после того как отработали страницы с классом и news.list
Не, такое не возможно. init.php в начале выполняется. Если в начале страницы не подключить "как обычно на страницах" ядро - не будет ни начала страницы, да и подключение компонента вызовет ошибку

Добавлено через 3 минуты
Цитата Сообщение от Avgust Pier Посмотреть сообщение
То есть стоило попробовать создать init.php конкретно для текущего сайта ?
Проверить лежит ли init.php именно в каталоге local текущего сайта. А так, как видно из кода ядра, что я привел выше. init.php может загружаться сразу три файла. (каждый отдельно будет определяться грузить из local или из bitrix)

Добавлено через 1 минуту
вот тут описан жизненый цикл запроса
0
1 / 1 / 1
Регистрация: 28.11.2020
Сообщений: 110
10.11.2025, 12:35  [ТС]
А что еще в теории может помешать определению значения константы ? У меня вообще 0 идей, помимо многосайтовости, и не хочется оплачивать экзамен, пока есть подобная проблема, а смоделировать ее у себя локально я не знаю как. Что вы думаете насчет ручного подключения init.php через require_once прямо в файл класса ? Решило бы проблему ?

Хотя думаю, в этом нет смысла, в следующий раз оформлю отдельный файл под константы
0
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,449
Записей в блоге: 2
10.11.2025, 14:48
А там разве нет возможности бесплатно погонять тест в виртуалке? когда эти платные экзамены вводили вроде была такая фишка.

Цитата Сообщение от Avgust Pier Посмотреть сообщение
А что еще в теории может помешать определению значения константы ?
Только попытка определить ее дважды. а так самое правдоподобное, какая то неразбериха с путями. (ну либо опечатка в имени константы)

Цитата Сообщение от Avgust Pier Посмотреть сообщение
У меня вообще 0 идей,
Пробовали писать лог, как я указал выше?

Цитата Сообщение от Avgust Pier Посмотреть сообщение
Что вы думаете насчет ручного подключения init.php через require_once прямо в файл класса ? Решило бы проблему ?
Ну если где то все же проглядели проблему с путями - может быть.... но это так же может показать и тест с логированием который я предложил. Единсвтенно раз пишите что воспроизвелось только там..... там и надо пробовать.

Добавлено через 2 минуты
Здесь вроде как есть ссылка на виртуалку - ее себе устанавливали? Пробовали там?

Какой из тестов вы проходили?
0
1 / 1 / 1
Регистрация: 28.11.2020
Сообщений: 110
10.11.2025, 15:54  [ТС]
Цитата Сообщение от voral Посмотреть сообщение
А там разве нет возможности бесплатно погонять тест в виртуалке? когда эти платные экзамены вводили вроде была такая фишка.
Здесь вроде как есть ссылка на виртуалку - ее себе устанавливали? Пробовали там?
По руководству - на тестовой экзаменационной виртуалке надо самостоятельно устанавливать битрикс, то есть нет разницы с обычной виртуалкой без графического интерфейса, которую тоже качаешь с их сайта (в которой я и решаю билет). Но я все равно сейчас проверю на всякий случай

Цитата Сообщение от voral Посмотреть сообщение
Пробовали писать лог, как я указал выше?
Вскоре запишусь на еще один, если возникнет такая же проблема я попробую так сделать

Цитата Сообщение от voral Посмотреть сообщение
Какой из тестов вы проходили?
Я проходил сертификацию N2 - Основные инструменты кастомизации
0
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,449
Записей в блоге: 2
10.11.2025, 17:39
Цитата Сообщение от Avgust Pier Посмотреть сообщение
По руководству - на тестовой экзаменационной виртуалке надо самостоятельно устанавливать битрикс,
Тогда сомневаюсь, что виновата многосайтовость (если конечно по заданию ее не надо было создавать). Тут скорее ради попробовать воспроизвести. Хотя вероятно, что тут вообще именно во время теста что то пошло не так: опечатка в пути, в имени константы .......
0
1 / 1 / 1
Регистрация: 28.11.2020
Сообщений: 110
10.11.2025, 17:47  [ТС]
Не, вы не так поняли, на самом экзамене уже всё установлено. Это надо делать в случае той ознакомительной версии виртуалки, которую вы скинули. То есть на их виртуалке и правда могло быть несколько сайтов, т.к. даже в описании экзамена указано, что есть две директории для разных сертификаций. В общем я сейчас установлю все что там требуется и проверю, там к установке приложен архив с бэкапом и возможно там установится такое же окружение
0
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,449
Записей в блоге: 2
11.11.2025, 07:43
Цитата Сообщение от Avgust Pier Посмотреть сообщение
То есть на их виртуалке и правда могло быть несколько сайтов, т.к. даже в описании экзамена указано, что есть две директории для разных сертификаций
Там могут быть развернуты два отдельных сайта. В любом случае это можно проверить в админке Настройки - Настройки продукта - Сайты - Список сайтов
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.11.2025, 07:43
Помогаю со студенческими работами здесь

Безопасная работа с init.php
Здравствуйте. Мне нужно отредактировать файл init.php. При этом доступа по ftp у меня нет. Как-то...

/docs/bitrix/php_interface/init.php
Есть сайт http://www.alttradition.ru/ Подскажите пожалуйста как исправить появившуюся ошибку. На...

Требуется ваша подсказка /docs/bitrix/php_interface/init.php
Есть сайт http://www.alttradition.ru/ Помогите пожалуйста. Подскажите как исправить появившуюся...

Можете ли прислать пример обработчика в init.php
Можете ли прислать пример обработчика в init.php . В нашем случае например - нужен обработчик -...

Применить правило только к определённым страницам в хуке 'init'
Есть код, который добавляет .html в конец страниц: function true_add_html_on_pages() { // при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru