• Как поулчить XML выгрузку на Битрикс с вложенными атрибутами?

    vhood
    @vhood
    Не забывайте отмечать решения
    Если это (ссылку взял из комментов в документации) и есть класс \Bitrix\Main\XmlWriter, то с его помощью - никак.

    Он пишет сразу в файл, так что и регуляркой итоговый результат не пройти.

    Можно залезть в него рефлексией, но в программировании это моветон и читабельность кода будет ухудшена.

    Самый оптимальный вариант - наследовать этот класс, изменить несколько его функций и использовать унаследованный класс. Примерно так:
    class AppXmlWriter extends XmlWriter
    {
        private $file = '';
        private $charset = '';
        private $tab = 0;
        private $f = null;
        private $lowercaseTag = false;
        private $errors = array();
    
        // конструктор скопирован, т.к. там все private
        public function __construct(array $params)
        {
            if (isset($params['file']))
            {
                $server = \Bitrix\Main\Application::getInstance()->getContext()->getServer();
                $this->file = $server->getDocumentRoot() . trim($params['file']);
                // create new file
                if (
                    isset($params['create_file']) &&
                    $params['create_file'] === true &&
                    is_writable($this->file)
                    )
                {
                    unlink($this->file);
                }
            }
            if (isset($params['charset']))
            {
                $this->charset = trim($params['charset']);
            }
            else
            {
                $this->charset = SITE_CHARSET;
            }
            if (isset($params['lowercase']) && $params['lowercase'] === true)
            {
                $this->lowercaseTag = true;
            }
            if (isset($params['tab']))
            {
                $this->tab = (int)$params['tab'];
            }
        }
    
        public function prepareAttributes(array $attributes): string
        {
            $result = '';
    
            if (empty($attributes)) {
                return $result;
            }
    
            foreach ($attributes as $key => $value) {
                $result .= sprintf(' %s="%s"', $key, $value);
            }
    
            return $result;
        }
    
        public function writeBeginTag($code, array $attributes = [])
        {
            if (!$this->f) {
                return;
            }
    
            fwrite($this->f, str_repeat("\t", $this->tab) . '<' . $this->prepareTag($code) . $this->prepareAttributes($attributes) . '>' . PHP_EOL);
            $this->tab++;
        }
    
        public function writeFullTag($code, $value, array $attributes = [])
        {
            if (!$this->f) {
                return;
            }
    
            $code = $this->prepareTag($code);
            $codeAttributes = $this->prepareAttributes($attributes);
            fwrite($this->f,
                str_repeat("\t", $this->tab) .
                (
                    trim($value) == ''
                    ? '<' . $code . $codeAttributes . ' />' . PHP_EOL
                    :   '<' . $code . $codeAttributes . '>' .
                    $this->prepareValue($value) .
                    '</' . $code . '>' . PHP_EOL
                )
            );
        }
    }
    Ответ написан
    1 комментарий
  • Как можно изменить выдачу данных из модели?

    vhood
    @vhood
    Не забывайте отмечать решения
    А что сложного?

    Из diff:
    Объекты DateTimeImmutable и DateTime можно сравнивать операторами сравнения.


    class Foo
    {
        public function isGreaterThenNow(): bool
        {
            return $this->someDate > new DateTime();
        }
    }


    чтобы это не выглядело костылем
    тогда проверять лучше не в ActiveRecord, а в спецификации какой-нибудь или ответсвенном объекте
    Ответ написан
  • Какой подход к хранению данных выбрать?

    vhood
    @vhood
    Не забывайте отмечать решения
    Денормализация реляционной базы данных нужна только для оптимизации(и то могут быть другие варианты) или хранения динамического набора полей.
    Оптимизация нужна только тогда, когда есть просадка производительности.

    Если нет очевидной нужны делать первый вариант, нужно делать второй.
    Ответ написан
    Комментировать
  • Как выполнить команды гита для вложенного репозитория?

    vhood
    @vhood
    Не забывайте отмечать решения
    Если project тоже является проектом, у которого должен быть свой репозиторий, то вложенные проекты нужно добавить в .gitignore
    /server/
    /client/
    /db/

    Если вложенные папки уже отслеживаются гитом, нужно так же удалить их для гита
    git rm -r --cached server
    git rm -r --cached client
    git rm -r --cached db
    
    git add .
    Ответ написан
    Комментировать
  • Yii2 codeception REST API mock external API?

    vhood
    @vhood
    Не забывайте отмечать решения
    Простой вариант (костыли):

    Добавить в функциях, которые ожидают ответ от внешних сервисов, исключения для тестов
    if (YII_ENV_TEST) {
        return true;
    }


    Правильный вариант:

    Зарегистрировать сервис внешних обращений в конфиге, в коде пользоваться только сервисом из контейнера Yii::$app->apiService

    Cоздать загрулшку и зарегистрировать ее в качестве этого сервиса в тестовом конфиге
    # config/test.php
    
    $config =  yii\helpers\ArrayHelper::merge(
        require(__DIR__ . '/web.php'),
        [
            'id' => 'app-tests',
            'components' => [
                'apiService' => [
                    'class' => 'App\Fake\ApiService',
                ],
            ],
        ],
    );
    return $config;

    Тестовый конфиг использовать в настройках модуля Codeception
    # tests/integration.suite.yml
    
    class_name: IntegrationTester
    modules:
        enabled:
          - Asserts
          - Yii2:
                part: [orm, email, fixtures]
                configFile: 'config/test.php'
    Ответ написан
  • Какой вариант структуры файлов моделей в Laravel лучше?

    vhood
    @vhood
    Не забывайте отмечать решения
    Для маленького проекта разницы нет. Можно использовать тот вариант, что быстрее.

    Если хочется знать, есть ли архитектурный паттерн для группировки сущностей - то это DDD (Domain Driven Design). Судя по всему, можно выделать 2 агрегата - Shop и Blog.

    Однако, до изучения темы, лучше выстраивать архитектуру на основе известных принципов программирования.
    Ответ написан
    2 комментария
  • Как переместить скопировать удаленный репозиторий в другой удаленный репозиторий?

    vhood
    @vhood
    Не забывайте отмечать решения
    1. Клонируешь проект из исходного репозитория

    git clone <ссылка на старый>

    2. Переходишь в склонированный репозиторий и добавляешь новый удаленный репозиторий

    git remote add copy <ссылка на новый>

    3, Пушишь коммиты в новый репозиторий (выше в команде я назвал его copy)

    git push --all copy
    Ответ написан
    Комментировать
  • Как обвести текст по контуру при переносе на две строки?

    vhood
    @vhood
    Не забывайте отмечать решения
    На мой взгляд, проще и красивее сделать на всю ширину660ba7a877a5a703431304.png

    Но если нужно получить ожидаемое, то вариант - явно разделить строки (например, в инспекторе я нажал shift+enter) и указать для ссылок white-space: pre-line. Соответственно, white-space можно менять в медиа запросе.

    <a href="#">Детское игровое и спортивное
    оборудование</a>

    .goods-cat__labels > a {
        white-space: pre-line;
    }

    660d20186dba8612507388.png
    Ответ написан
    1 комментарий
  • В какую сторону учиться, QA, front end или back end для реалистичного входа?

    vhood
    @vhood
    Не забывайте отмечать решения
    чуйка говорит, что через QA реалистичнее "ворваться". Что думаете?
    Думаю, это маркетинг.

    Вообще, хотелось бы, конечно, выучить хорошо Excel, SQL и дэшборды делать какие-нибудь на первых порах:), но судя по всему требуется знать финанализ, опыт в бизнесе и маркетинге и тд, чего у меня нет.
    Это требуется тем, кто ставит задачи, а разработчикам лишь для ознакомления и не обязательно.
    Смотри в сторону "разработчик баз данных / SQL разработчик" стажер/trainee.
    Советую хорошо изучить устройство баз данных, язык SQL и поработать с тестовыми данными и задачами.
    Ответ написан
    Комментировать
  • Как исправить синтаксическую ошибку в Битрикс?

    vhood
    @vhood
    Не забывайте отмечать решения
    Можно засунуть код в редактор, который подсвечивает синтаксис, и исправить там.

    Ошибок много, какие-то символы )"&gt; после span идут, href не назначен (переменная вызывается, в которой массив, а ключ массива отсутствует и php не закрывается).

    Вот, немного поправил именно тот участок, что предоставлен:
    <a href="<?=$arSection["SECTION_PAGE_UR"]?>" data-bx-app-ex-href="<?=$arSection["SECTION_PAGE_UR"]?>" class="section">
    			<div class="section__picture">
    				 <?
                                $picture = SITE_TEMPLATE_PATH.'/img/no_photo.png';
                                if ($arSection["PICTURE"] != ""){
                                    $picture = CFile::ResizeImageGet($arSection["PICTURE"], Array("height" => 175))["src"];
                                }
                                ?>
    				<div style="background-image:url('<span id=" title="Код PHP: &lt;?=$picture;?&gt;" class="bxhtmled-surrogate">
    					<span class="bxhtmled-surrogate-inner"><span class="bxhtmled-right-side-item-icon"></span><span class="bxhtmled-comp-lable" unselectable="on" spellcheck="false">Код PHP</span></span>
    				</div>
    				<div class="section__icon">
     <i class="far fa-sign-in"></i>
    				</div>
    			</div>
    			<div class="section__main">
    				 <?=$arSection["NAME"];?>
    			</div>
     </a>
    		</div>
    		 <?
                    if ($s > 5)
                        break;
                    $s++;?> <?endforeach;?>
    	</div>
    	 <?if (count($arSections) > 6):?>
    	<div class="button-line">
     <a href="/katalog/" class="button button_black wstyle wstyle_white">Посмотреть все категории</a>
    	</div>
    	 <?endif;?>
    </div>
     <?endif;?> <?
    $iblock_id = 4;
    $arServices = Array();
    $arFilterE = Array("IBLOCK_ID" => $iblock_id, "ACTIVE" => "Y");
    $arSelectE = Array("IBLOCK_ID", "ID", "NAME", "PREVIEW_PICTURE");
    $rsElement = CIBlockElement::GetList(
        Array("SORT"=>"ASC"),
        $arFilterE,
        false,
        false,
        $arSelectE
    );
    while($arElement = $rsElement->GetNextElement()){
        $arFieldsE = $arElement->GetFields();
        $arServices[] = $arFieldsE;
    }
    ?> <?if (count($arServices) > 0):?>
    <div class="block block_border">
    	<div class="title title_center">
    		Популярные услуги
    	</div>
    	<div class="row">
    		 <?$s = 1;?> <?foreach ($arServices as $arService):?>
    		<div class="col-lg-4">
     <a href="<?=$arService["DETAIL_PAGE_URL"]?>" data-bx-app-ex-href="<?=$arService["DETAIL_PAGE_URL"];?>" class="section section_wtitle">
    			<div class="section__picture">
    				 <?
                                $picture = SITE_TEMPLATE_PATH.'/img/no_photo.png';
                                if ($arService["PREVIEW_PICTURE"] != ""){
                                    $picture = CFile::ResizeImageGet($arService["PREVIEW_PICTURE"], Array("height" => 200))["src"];
                                }
                                ?>
    				<div style="background-image:url('<span id=" title="Код PHP: &lt;?=$picture;?&gt;" class="bxhtmled-surrogate">
    					<span class="bxhtmled-surrogate-inner"><span class="bxhtmled-right-side-item-icon"></span><span class="bxhtmled-comp-lable" unselectable="on" spellcheck="false">Код PHP</span></span>
    				</div>
    				<div class="section__title">
    					 <?=$arService["NAME"];?>
    				</div>
    			</div>
     </a>
    Ответ написан
    1 комментарий
  • Как убрать полосу сверху?

    vhood
    @vhood
    Не забывайте отмечать решения
    Убрать галочку View -> Appearance -> Menu Bar

    Или найти управление этой панелью в меню660a47b433b4f247033803.png
    Ответ написан
    Комментировать
  • Как правильно пройтись циклом внутри другого?

    vhood
    @vhood
    Не забывайте отмечать решения
    Одиакового ничего, идея скорее всего выводить по идексу в массиве

    Значит нужно по индексу и связывать
    <?php foreach ($arItem['PROPERTIES']['IMG_BEFORE']['VALUE'] as $index => $arImgBeforeSrc): ?>
        <?php $arImgAfterSrc = $arItem['PROPERTIES']['IMG_AFTER']['VALUE'][$index] ?>
        <div class="cocoen">
          <img data-src="" class="blog-list__item-image<?=($arParams['ROUNDED_IMAGE'] ? ' rounded' : '');?>" src="<?=CFile::getPath($arImgBeforeSrc);?>" alt="">
          <img data-src="" class="blog-list__item-image<?=($arParams['ROUNDED_IMAGE'] ? ' rounded' : '');?>" src="<?=CFile::getPath($arImgAfterSrc);?>" alt="">
        </div>
    <?php endforeach ?>

    Только в коде не учтен момент, когда изображение "после" может отсутствовать. Во избежание ошибки, вторую картинку лучше в условии выводить и в объявлении переменной $arImgAfterSrc проверку сделать.
    Ответ написан
    Комментировать
  • Почему не получается сразу получить актуальную версию?

    vhood
    @vhood
    Не забывайте отмечать решения
    git pull

    подтягиваю на сервер актуальную версию git fetch origin master
    только информацию об этой версии
    Ответ написан
    4 комментария
  • Пропала вкладка OUTPUT в терминале и не обновляется код - как исправить?

    vhood
    @vhood
    Не забывайте отмечать решения
    1) Клинки правой кнопкой мыши на панель с терминалом и включи output
    6603aa640ed73675783795.png

    2) А файл сохранить перед запуском не пробовали? На скрине файлы обновленные и не сохраненные (точка белая справа). Можно настроить автосохранение, если не удобно вручную.
    6603aafe3da02081600040.png
    Ответ написан
    4 комментария
  • Как лаконичнее всего выбрать селекторы?

    vhood
    @vhood
    Не забывайте отмечать решения
    div[id], лучше от родителя .parent div[id]
    Ответ написан
    Комментировать
  • Как скрыть верхнюю панель со строками vs code 1.87?

    vhood
    @vhood
    Не забывайте отмечать решения
    Добавить в settings.json
    "editor.stickyScroll.enabled": false
    Ответ написан
    Комментировать
  • Миддл без юнит тестирования?

    vhood
    @vhood
    Не забывайте отмечать решения
    В разных компаниях разный уровень знаний для middle. Где-то тесты ни для какого грейда не требуются, как на твоей
    полноценной работе

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

    я за честность в резюме
    только не надо писать "не умею", лучше просто не упоминать
    Ответ написан
    Комментировать
  • Как настроить PHP Psalm в VS Code для вложенной папки?

    vhood
    @vhood
    Не забывайте отмечать решения
    "psalm.configPaths": [
        "src/psalm.xml",
    ]
    Ответ написан
    Комментировать
  • Как сделать что бы открывалось модальное окно и в него выводились данные из БД?

    vhood
    @vhood
    Не забывайте отмечать решения
    Нужно с помощью JS посылать AJAX запрос на PHP скрипт.

    Далее 2 варианта:

    1) PHP скрипт возвращает данные (например, в формате JSON), JS заполняет поля модального окна этими данными и отображает его

    2) PHP скрипт возвращает HTML уже готового модального окна, JS только подставляет его в родительский элемент

    Пример запроса:

    async function openModal(id = 0){
        if(!id){
           return;
        }
    
        const response = await fetch(`library.php?id=${id}`);
        const responseText = await response.text();
    
       // Дальше делайте манипуляции с модальным окном и полученными данными
    }
    Ответ написан
  • Почему при подключении скрипта в теге head возникает ошибка?

    vhood
    @vhood
    Не забывайте отмечать решения
    Разберем вопрос:

    он уже есть в самом html документе
    браузер разбирает HTML документ постепенно

    js должен видеть
    это в каком контракте написано?

    почему если скрипт подключить в теге head то получим ошибку, а если внизу body то всё нормально
    потому что скрипт блокирующий и браузер выполняет его до того, как появляется H1

    Варианты решения:
    1. Оставить скрипты внизу body, что-бы выполнялись после загрузки вышестоящих тегов
    2. Атрибутом defer указать браузеру, что выполнять скрипт нужно после построения DOM дерева
    3. Прослушивать события страницы на стороне JS, работать с тегами только после построения DOM дерева
    Ответ написан
    Комментировать