Николаев Виталий
<Разработка сайтов>
|

Битрикс выгрузить все элементы вместе со свойствами в файл

Этот скрипт выгружает все элементы инфоблока в файл csv
<?php
use Bitrix\Main\Loader;

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

if (!Loader::includeModule("iblock")) {
    die("Модуль Инфоблоки не подключен");
}

$IBLOCK_ID = 55;
$FILE_PATH = $_SERVER["DOCUMENT_ROOT"] . "/upload/export_iblock_{$IBLOCK_ID}.csv";

// Получаем список всех свойств инфоблока
$arProps = [];
$rsProps = CIBlockProperty::GetList(
    ["SORT"=>"ASC"],
    ["IBLOCK_ID"=>$IBLOCK_ID, "ACTIVE"=>"Y"]
);
while ($arProp = $rsProps->Fetch()) {
    $arProps[$arProp["CODE"]] = $arProp;
}

// Заголовки для CSV: ID, NAME + все свойства
$headers = ["ID", "NAME"];
foreach ($arProps as $code => $prop) {
    $headers[] = $prop["CODE"];
}

$fp = fopen($FILE_PATH, "w");
fputcsv($fp, $headers, ";");

// Выбираем элементы инфоблока
$arSelect = ["ID", "IBLOCK_ID", "NAME"];
$arFilter = ["IBLOCK_ID" => $IBLOCK_ID, "ACTIVE" => "Y"];
$res = CIBlockElement::GetList(["ID"=>"ASC"], $arFilter, false, false, $arSelect);

while ($arItem = $res->GetNextElement()) {
    $fields = $arItem->GetFields();
    $props  = $arItem->GetProperties();

    $row = [$fields["ID"], $fields["NAME"]];

    foreach ($arProps as $code => $propInfo) {
        $value = $props[$code]["VALUE"];

        if (empty($value)) {
            $row[] = "";
            continue;
        }

        // Если свойство — файл (в том числе множественное)
        if ($propInfo["PROPERTY_TYPE"] === "F") {
            if (is_array($value)) {
                $filePaths = [];
                foreach ($value as $fileId) {
                    $filePath = CFile::GetPath($fileId);
                    if ($filePath) {
                        $filePaths[] = $filePath;
                    }
                }
                $row[] = implode(",", $filePaths);
            } else {
                $row[] = CFile::GetPath($value);
            }
        }
        // Если множественное свойство (строки, числа, списки и пр.)
        elseif ($propInfo["MULTIPLE"] === "Y" && is_array($value)) {
            $row[] = implode(",", $value);
        }
        // Обычное свойство
        else {
            $row[] = $value;
        }
    }

    fputcsv($fp, $row, ";");
}

fclose($fp);

echo "Экспорт завершен. Файл: ".$FILE_PATH;

Битрикс получаем все свойства элемента

Для получения всех свойств элементов битрикс можно воспользоваться скриптом, в этом скрипте я еще записал свойства в csv файл:
<?php

use Bitrix\Main\Loader;

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

if (!Loader::includeModule("iblock")) {
    die("Модуль iblock не подключен");
}

$IBLOCK_ID = 55;
$filePath = $_SERVER["DOCUMENT_ROOT"]."/upload/iblock_{$IBLOCK_ID}_fields.csv";

// Открываем файл для записи
$fp = fopen($filePath, "w");

// Заголовки CSV
fputcsv($fp, ["Название", "Код", "Обязательное", "Множественное", "Тип поля"], ";");

// Функция для преобразования типа
function getPropertyTypeName($prop) {
    $types = [
        "S" => "Строка",
        "N" => "Число",
        "L" => "Список",
        "F" => "Файл",
        "E" => "Привязка к элементу",
        "G" => "Привязка к разделу"
    ];

    $baseType = $types[$prop["PROPERTY_TYPE"]] ?? $prop["PROPERTY_TYPE"];

    // Если пользовательский тип указан — уточняем
    if (!empty($prop["USER_TYPE"])) {
        $baseType .= " ({$prop["USER_TYPE"]})";
    }

    return $baseType;
}

// Получаем список свойств инфоблока
$properties = CIBlockProperty::GetList(
    ["SORT" => "ASC"],
    ["IBLOCK_ID" => $IBLOCK_ID]
);

while ($prop = $properties->Fetch()) {
    $row = [
        $prop["NAME"],
        $prop["CODE"],
        ($prop["IS_REQUIRED"] === "Y" ? "да" : "нет"),
        ($prop["MULTIPLE"] === "Y" ? "да" : "нет"),
        getPropertyTypeName($prop)
    ];

    fputcsv($fp, $row, ";");
}

fclose($fp);

echo "Файл успешно создан: ".$filePath;

Битрикс. Ошибка! innodb_strict_mode=ON, требуется OFF

В файле:
/bitrix/php_interface/after_connect_d7.php

добавляем строку:
$this->queryExecute("SET innodb_strict_mode=0");

openserver cannot create file hosts

При запуске OpenServer появляется ошибка:
openserver cannot create file hosts
openserver.jpg

Попробуйте изменить права на файл hosts, командой, консоль cmd нужно запускать от имени администратора:
attrib.exe -s -r -h -a C:\Windows\system32\drivers\etc\hosts

Установка CodeWhisperer в PhpStorm

Так как githab copilot в россии не работает я перешел на CodeWhisperer от Amazon.

Для установки CodeWhisperer в PhpStorm переходим в меню File -> Settings, выбираем пункт Plugins

Находим плугин AWS Toolkit и устанавливаем.

Screenshot_5.png  

selenium на сервере без графического интерфейса в режиме headless

Для запуска selenium на сервере ubunty или debian без графического интерфейса, скачиваем последнею версию браузера Chrome
wget -nc https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb 

устанавливаем браузер
apt install -f ./google-chrome-stable_current_amd64.deb

устанавливаем selenium и webdriver-manager
pip install selenium webdriver-manager 

создаем и запускаем скрипт, например на python
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)

driver.get("https://www.python.org/")
print(driver.title)
driver.close()

Вирус .htaccess

В последнее время получил распространение вирус который создает файлы свои .htaccess во всех директориях сайта.
Если у вас сайт под управлением битрикса то воспользуйтесь "сканером безопасности" в админке битрикса, чаще всего он находит исходные файлы php из которых распространяется вирус, и следуйте рекомендациям сканера, постарайтесь устранить все проблемы.

Но иногда в админку из-за модифицированного файла .htaccess не зайти.
Найти и удалить все файлы .htaccess можно с помощью следующей команды, предварительно перейдя в директорию сайта.
find . -type f -name ".htaccess" -exec rm -v {} \;

Затем нужно заменить .htaccess на свой .htaccess.restore и запретить его изменять с помощью chattr.
chattr -i .htaccess; cp .htaccess.restore .htaccess; chattr +i .htaccess

Битрикс. Получить местоположение из заказа

Получаем местоположение из заказа по номеру заказа
$db_props = CSaleOrderPropsValue::GetOrderProps("номер_заказа");
while ($arProps = $db_props->Fetch())
{
    if ($arProps["TYPE"]=="LOCATION")
    {
        $arVal = CSaleLocation::GetByID($arProps["VALUE"], LANGUAGE_ID);
        echo htmlspecialchars($arVal["COUNTRY_NAME"]." - ".$arVal["CITY_NAME"]);
    }
}