• В чем отличие template_styles.css от styles.css в битриксе?

    gromdron
    @gromdron
    Работаю с Bitrix24
    template_styles.css отвечает за стили шаблона, который будет отображаться у пользователя на странице
    styles.css - стили которые будут использовать в ВИЗУАЛЬНОМ РЕДАКТОРЕ при создании/редактировании страницы.

    Например: в template_styles.css может быть определен стиль:

    div {
    	font-weight:bold;
    }


    И для всего сайта у вас весь текст в div будет жирный.
    Но в визуальном редакторе может быть прописано:

    div {
    	font-weight: normal;
    }


    Таким текст на всем сайте у Вас будет жирный, а в визуальном редакторе нет. Вот и получиться, что Ваш визуальный редактор не такой уж и визуальный.
    Для того чтобы этого не произошло, дополнительно и существует этот файл :)
    Ответ написан
    Комментировать
  • Как создать агента в своём модуле?

    gromdron
    @gromdron
    Работаю с Bitrix24
    А в чем собственно вопрос? Делайте как по документации

    1) При установки модуля добавляем агент:
    \CAgent::AddAgent( "\\Your\\Module\\SuperClass::superAgent();", "your.module", "N", 10 * 24 * 3600, "", "Y");

    где
    "\\Your\\Module\\SuperClass::superAgent();" - код php который должен выполняться (точка с запятой в конце строго!!!)
    "your.module" - название вашего модуля
    "N" - периодичность
    10 * 24 * 3600 = периодичность запуска
    '' - первая дата проверки (оставлять пустой)
    "Y" - активность агента

    2) При удалении - очищаем агенты
    \CAgent::RemoveModuleAgents("your.module");
    3) Если файлы располагаются по канонам d7 ( /your.module/lib/superclass.php ), то ничего больше делать не нужно, если старый - то нужно прописать в include.php автолоадер для вашего класса с агентом
    Ответ написан
    2 комментария
  • На что намекает галочка возле корневой папки проекта в PhpStorm

    DWSVad
    @DWSVad Автор вопроса
    Вообщем долго шарил по статьям посвященным phpStorm, в итоге нашел ответ в статье azverin: Продуктивное использование PHPStorm. Спасибо тебе, azverin за нее.

    Как оказалось это закладка, которую я случайно поставил на корневую папку.
    А ставить ее можно на любое место в проекте и части кода файла, с помощью F11.
    И так же легко просмотреть список закладок комбинацией Shift+F11.
    (Приведенные сочетания клавиш — дефолтные)
    Ответ написан
    1 комментарий
  • Как вывести шаблон одного компонента внутри другого и избежать проблем с кэшированием?

    @anton99zel Куратор тега 1С-Битрикс
    29а класс средней школы №7
    Ответ написан
    Комментировать
  • Bitrix ORM: Как получить элементы с нулевым CNT?

    @Snatch87
    Битриксоид по принуждению
    Если я все правильно понял, то Вам нужно немного дорабоать один из рантаймов
    Приведу пример из своего кода, попробуйте адаптировать под свой:
    ->registerRuntimeField('PRICE', [
                    'data_type' => \Bitrix\Catalog\PriceTable::class,
                    'reference' => [
                        '=this.ID' => 'ref.PRODUCT_ID',
                        '=ref.CATALOG_GROUP_ID' => new \Bitrix\Main\DB\SqlExpression('?', 1)
                    ]
                ])
    Ответ написан
    Комментировать
  • Как актуализировать элементы инфоблока (REST)?

    0 А чо не md5?
    1 Как-то странно - вы проверяете контрольную сумму и обновляете элемент если она совпадает? А зачем? Если у вас контролька от данных и они не изменились - зачем обновлять? Пропустите этот элемент.
    2 Зачем вообще сначала сверять контрольные суммы? Какой в этом смысл если у большинства он будет разный?
    3 Вы понимаете что ваш алгоритм (если вы его правильно описали - я код не смотрел) будет обновлять элементы которы не нуждаются в обновлении (с совпадающем хэшем) и будет создавать дубли объектов, если их надо обновить, так как вы добавляете элементы с отличными хэшами в массив ADD?

    Как делал бы я - получил объекты.
    Собрал их внешние id и извлек из базы справочник по этим id по полю XML_ID, такой где XML_ID => TMP_ID.
    Далее переберал бы входные объекты, вычисляя для них хэш и если объект с XML_ID == id есть в справочнике, то сверял бы хэш. Если он совпадает - пропускаем объект. Если нет - добавляем его в uppdate. Если объекта нет в справочнике - добавляем его в add.
    Ответ написан
    4 комментария
  • Bitrix ORM: Как реализовать импорт в инфоблок нескольких тысяч элементов?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Но ведь почему-то разработчики Битрикса решили от него отказаться?


    Они не "решили отказаться", они его архитектурно еще не сделали. Элементы инфоблоков это не только запись в таблице это еще и свойства, которые могут хранится в двух вариантах, так что это вовсе не так просто.

    Выходит нужно использовать старый CIBlockElement::Add() без вариантов?

    Если хотите атомарно и без нарушений логики - да.
    По факту, если у вас простая запись, т.е. без свойств, то можно подглядеть что он делает и выполнить по аналогии. Будет в целом почти равнозначно для импорта.

    Есть какой-то аналог Batch Processing от Doctrine?

    Аналогов нет, но и операция не такая уж частая. Есть потребность в таких объемах - обычно либо это сторонние каталоги (цены, наличие, свойства и т.п.) и тут без CIblockElement::add не обойтись, либо своя таблица (а там уже что хочешь, хоть sql)
    Ответ написан
    4 комментария
  • Bitrix ORM: Как использовать JOIN, чтобы сократить количество запросов?

    @Snatch87
    Битриксоид по принуждению
    В runtime Вы можете передать сколько угодно объектов references.
    Приведу не большой пример, только я использую не гет листы, объект Query:
    $query  = \Entities\Marketing\PostingTmpTable::query()
                 ->registerRuntimeField('CONTACT', [
                     'data_type' => '\Bitrix\Sender\ContactTable',
                     'reference' => [
                         '=this.CONTACT_ID' => 'ref.ID',
                     ],
    //                 'join_type' => 'right'
                 ])
                 ->registerRuntimeField('PROPERTY', [
                    'data_type' => $hlBlockEntity,
                    'reference' => [
                        '=this.CONTACT.CODE' => 'ref.UF_EMAIL'
                    ],
    //                 'join_type' => 'right'
                ])
            ;
    Ответ написан
    4 комментария
  • Как сократить количество запросов для получения свойства "Справочник"?

    Если прям тупо в лоб:
    $arRef = [];
    $resultArray = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity('Entity')->getDataClass()::getList([
            'select' => ['UF_NAME'],
            'filter' => [],
        ]);
    while ($rowArray = $resultObj->fetch()) {
        $arRef[$resultArray['UF_XML_ID']] = $resultArray['UF_NAME'];
    }
    foreach ($arResult['ITEMS'] as $index => $arItem) {
        $arResult['ITEMS'][$index]['PROPERTIES']['PROP']['UF_NAME'] = $arRef[$arItem['PROPERTIES']['PROP']['VALUE']];
    }
    Ответ написан
    1 комментарий
  • Как сократить количество запросов для получения свойства "Справочник"?

    @Snatch87
    Битриксоид по принуждению
    Для начала Вам нужно собрать массив всех xml_id по которым вы будете искать

    $xmlIds = [];
    
    foreach ($arResult['ITEMS'] as $index => $arItem) {
        $xmlIds[] = $arItem['PROPERTIES']['PROP']['VALUE']];
    }

    На всякий уберем дубли:
    $xmlIds = array_unique($xmlIds);

    Найти найти все записи из HL по с UF_XML_ID
    if(!empty($xmlIds)){
    	$resultArray = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity('Entity')->getDataClass()::getList([
            'select' => ['UF_NAME'],
            'filter' => ['@UF_XML_ID' => $xmlIds],
        ]);
        
    	while ($rowArray = $resultObj->fetch()) {
    	    $arRef[$resultArray['UF_XML_ID']] = $resultArray['UF_NAME'];
    	}	
    }
    Ответ написан
    Комментировать
  • Bitrix D7 ORM: как узнать ID существующей записи?

    @eugenezadorin
    Адекватно, если это единичная операция добавления - например если это отправка формы.

    Производительность может упасть, если такое добавление происходит в цикле, и дубликатов имени будет много. В этом случае возможно лучше будет заранее сформировать справочник существующих книг "имя - id", и по нему сверяться перед добавлением.
    Ответ написан
    2 комментария
  • Bitrix D7 ORM: как узнать ID существующей записи?

    Да - норм.
    Но добавляю, что такое решение как предлагает eugenezadorin будет хорошим только в ситуации когда дубли очень вероятное и частое явление. В противном случае лучшим решением будет, собирать в отдельный массив в цикле имена, которые были отклонены, из-за дублирования, а потому в конце цикла добавления, если цикл имен не пуст, достать одним запросом список id соответствующий собранным в запросе именам.
    Преимущество в том, что если конфликтов не случилось, запрос не делается вообще.

    Кстати если добавление идет не в цикле, а вероятность дублей у вас больше 50% (даже возможно 40%) то лучшим решением будет сначала проверить нет ли уже записи с таким именем и только потому выполнять добавление, если ее нет.
    Ответ написан
    2 комментария
  • Как создать сущность D7?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Сущность D7 это обычный класс. Для того чтобы все работало надо этот класс подключить.
    Если класс вне модуля то через autoload или обычным include (или require).

    У вас же судя по всему модуль. Для того чтобы все работало, надо чтобы модуль имел как минимум обязательные файлы и был установлен через меню системы. Именно установлен, а не просто скопирован в папку modules.

    Далее класс который описывает вашу таблицу в БД, нужно разместить в папке lib модуля. Название файла должно быть в нижнем регистре и не должно содержать слова Table.
    Например для класса BooksTable, имя файла должно быть books.php
    Ответ написан
  • Какая разница между ORM-сущностью и Highload?

    sabramovskikh
    @sabramovskikh
    Хайлоад это просто интерфейс для создания таблиц через админку.
    ОРМ это утилита для работы с бд. Его можно с любой таблицей в бд использовать.
    Класс для работы с хайлодами наследуется от ОРМ.
    Ответ написан
    3 комментария
  • Как получить status: error (bitrix ajax d7)?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    public function sendMessageAction(): string
    {
        $i = 0;
    
        if ($i === 0) {
            throw new Exception('Ошибка');
        }
        
    }
    Ответ написан
    4 комментария
  • Как интегрировать Doctrine 2 в 1С-Битрикс?

    serginhold
    @serginhold
    Ничего хорошего у тебя не получится.
    Но если очень хочется, то пишешь вот такой класс https://github.com/doctrine/dbal/blob/2.7/lib/Doct...
    разница будет в том, что ты должен туда подсунуть уже имеющийся коннект к \mysqli, вместо создания нового.
    Сам готовый коннект берешь из bitrix Connection::getResource().
    Далее смотришь доку и инициализируешь доктрину со своим драйвером.
    Нужно это для того, чтобы не висело два подключения к бд.
    Но если тебе пофигу, можешь просто создать второе подключение, и тогда вообще "красота" будет
    Ответ написан
    Комментировать
  • Как скрестить bitrix с symfony 2?

    @PaulJE
    Смотря что подразумевается по скрещиваением. Symfony весьма гибкий продукт, и есть возможность вытягивать из него отдельные компоненты для внедрения в свое приложение. Но я как понимаю вам нужно решение для администрирования сущностей, аля CRUD для всего и вся? На базе Symfony можно использовать автогенерирование моделей по схеме из БД и прикрутить какой нибудь SonataAdminBundle
    Ответ написан
    1 комментарий
  • Регулярные выражения: как добавить пробел между словами в строке?

    glaphire
    @glaphire Куратор тега PHP
    PHP developer
    preg_split надо заюзать для разбивки по заглавным буквам, дальше mb_strtolower и склеить строку заново
    /(?=[А-Я])/u
    https://www.phpliveregex.com/p/th0
    Ответ написан
    Комментировать
  • Как реализовать запрос с использованием PHP SoapClient?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Если запрос не HTTPS рекомендую установить программу WireShark, и попробовать посмотреть в каком виде идут другие запросы. Потом можно составить запрос в виде текста и отправить его. А уже потом прикидывать как на это все навесить код, который в пыхе вшит под словом Soap.

    Потому что в этом стандарте упрощающем жизни столько ада, что лучше б его не было
    Ответ написан
    Комментировать
  • Как подсчитать только вложенные элементы массива без родительских?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Добро пожаловать в пхп. Ты нащупал одну из мощнейших его проблем, которую никакой авторитетный пхпшник никогда не признает.

    В пыхе нет разделения на пачку и штуку.
    Здесь есть обьекты, которым надо писать чертов класс. Каждый раз. Каждую минуту.

    Сначала по существу, потом о вечном...

    Количество родительского - count($array);
    Когда ты поставил в count() вторым параметром единицу - ты посчитал сумму количеств во всех элементах. Потом отнял количество в главном массиве. Технически ты получил ответ, но сама задача - сначала сделать пачку-пачек а потом посчитать количество элементов во всех пачках без учета основной пачки - это немного странно

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

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

    Вот тебе функции из моей библиотеки:

    // is_array
      // проверяет массив на ключи - цифровые, идущие по порядку с 0
      function _is_array($array) : bool
      {
        if (! is_array($array)) return false;
        if (! $array) return true; // empty array is array too
    
        $i = count($array);
        while ($i-- && ! array_key_exists($i, $array)) return false;
    
        return true;
      }
    
      // is_list
      // проверяет является ли массив - списком (list) без буквенных ключей. цифровые ключи в отличие от array могут идти в любом порядке
      function _is_list($array) : bool
      {
        if (! is_array($array)) return false;
        if (! $array) return true; // empty list is list too
    
        // contains string key? not a list
        foreach (array_keys($array) as $key) {
          if (is_string($key)) return false;
        }
    
        return true;
      }
    
      // is_assoc
      // проверяет, является ли массив "грязным" - содержит хотя бы один строковый ключ
      function _is_assoc($array) : bool
      {
        if (! is_array($array)) return false;
        if (! $array) return false; // empty assoc is not an assoc
    
        // contains string key? there's assoc
        $result = false;
        foreach (array_keys($array) as $key) {
          if (! is_string($key)) continue;
    
          $result = true;
          break;
        }
    
        return $result;
      }
    
      // is_dict
      // проверяет, является ли массив - словарем (dict), без цифровых и пустых ключей
      function _is_dict($array) : bool
      {
        if (! is_array($array)) return false;
        if (! $array) return false; // empty dict is not a dict
    
        foreach (array_keys($array) as $key) {
          if (is_int($key)) return false; // 0,1,2
          if (! $key) return false; // null, ''
        }
    
        return true;
      }


    Теперь массив для тебя - это пачка чего-то.

    Лист, или список - это пачка которая прошла через фильтры (обычно функции фильтрации не изменяют ключей, а просто выбрасывают лишние), или это еще бывает пачка привязанная к таблице-связке в many-to-many.

    Assoc - это фарш того и этого. Желательно делать их пореже, но местами бывает когда надо взлететь с "некоторые значения не имеют ключей и их подставить по порядку, а те которые с ключами - использовать как есть".

    Dict - полноценный словарь, ключ-значение, являющийся единицей, которую надо класть в массив целиком и воспринимать как цельную сущность.

    Вместо Dict можно использовать new StdClass или другой обьект. В общем дикт это ленивый обьект. Впадлу писать класс и вообще тут одну задачку решить, не хочется - вот тебе дикт.
    Ответ написан
    Комментировать