• Почему сбрасывается ref на элемент?

    svisch
    @svisch Автор вопроса
    WbICHA, ))) ладно, спасибо еще раз)
    Написано
  • Почему сбрасывается ref на элемент?

    svisch
    @svisch Автор вопроса
    WbICHA, свойства шаблона будут иметь каждое свое. Но когда мы этот шаблон присваиваем элементам reExport, то в каждом из них они по идее должны повторяться. Т.е. при рендере в паттерне создаются уникальные, далее копируются ссылки в новых элементах reExport. Хотя повторюсь все работает как надо
    Написано
  • Почему сбрасывается ref на элемент?

    svisch
    @svisch Автор вопроса
    WbICHA, сработало ваше предложение о функции вне компонента.
    Сделал функцию
    function createRef() {
    return {current: null}
    }

    и в паттерне reExport в свойствах пропов указывал createRef()
    За это спасибо)
    Но, если вам не сложно в двух словах поясните плиз как это работает в плане жизненного цикла Реакт и js в целом.
    В моем понятии, когда идет рендер константа паттерна в ref свойствах своих элементов вызывает createRef() и получает на каждом из них новый объект {current: null}
    Непонятно то, когда мы добавляем новую строку в reExport и делаем let newItem = reExportPattern. Мы же ссылаемся на тот же объект и по идее так же должны быть на каждом из элементов reExport одни и те же объекты! Не?)
    Написано
  • Почему сбрасывается ref на элемент?

    svisch
    @svisch Автор вопроса
    WbICHA, спасибо за советы)
    Написано
  • Почему сбрасывается ref на элемент?

    svisch
    @svisch Автор вопроса
    WbICHA,

    Ты делаешь глубокое копирование при каждом ререндере. И это не имеет смысла, пока ты создаёшь объект внутри тела компонента.
    А работает это потому, что ты таким образом создал псевдо-рефы.


    не имеет смысла, потому что память например жрет или чему то мешает? Не пойму почему это плохо! Работает же))
    Написано
  • Почему сбрасывается ref на элемент?

    svisch
    @svisch Автор вопроса
    WbICHA, спасибо большое за наводку! Я что-то и не подумал, что при создании нового reExport я передаю один и тот же объект:)
    А как вам такое решение?
    const [reExport, setReExport] = useState([structuredClone(reExportPattern)]);
    
    function addReExportRawHandler() {
            let nextReExp = [...reExport];
            let newItem = structuredClone(reExportPattern);
    
            nextReExp.push(newItem);
    
            setReExport(nextReExp);
        }


    так на первый взгляд все работает))
    И если не сложно поясните про пвсевдо-рефы. Что то не слышал о таком. Это какой то костыль? Че то не пойму как обычный объект может ссылаться на элемент.
    А на счет второго вашего предложения, попробовал для интереса создать колбэк реф упрощенно в виде
    function setRef(el) {
    reExport[item].num.ref = el
    }
    
    <input ref={setRef}>

    и так выдает ошибку el undefinded. Что-то не так делаю?)

    И да, скопируй свой ответ в отдельный ответ - помечу его как решение)
    Написано
  • Почему сбрасывается ref на элемент?

    svisch
    @svisch Автор вопроса
    WbICHA, понял. Весь компонент не могу, слишком большой. Держите то, что имеет отношение к вопросу)
    const reExportPattern = () => {
            let pattern = {
                kodfito: '',
                num: '',
                date: '',
                product: [{
                    production: {
                        id: null,
                        value: ''
                    },
                    netto: '',
                    unit: '',
                    country: {
                        id: null,
                        value: ''
                    }
                }]
            }
    
            return pattern;
        }
    
    const [reExport, setReExport] = useState([reExportPattern()]);
    
    const modelFieldRegExpPattern = {
            kodfito: {
                require: true,
                regexp: /^\d+$/,
                ref: useRef(null),
                checked: false
            },
            num: {
                require: true,
                regexp: /^[\w\/-]{4,}$/,
                ref: useRef(null),
                checked: false
            },
            date: {
                require: true,
                regexp: null,
                ref: useRef(null),
                checked: false
            },
            product: {
                production: {
                    require: true,
                    regexp: null,
                    ref: useRef(null),
                    checked: false
                },
                netto: {
                    require: true,
                    regexp: null,
                    ref: useRef(null),
                    checked: false
                },
                unit: {
                    require: true,
                    regexp: /^\d+$/,
                    ref: useRef(null),
                    checked: false
                },
                country: {
                    require: true,
                    regexp: null,
                    ref: useRef(null),
                    checked: false
                }
            }
        }
    
        const modelFieldRegExp = useRef([modelFieldRegExpPattern]);
    
    function addReExportRawHandler() {
            let nextReExp = [...reExport];
            let newItem = reExportPattern();
            nextReExp.push(newItem);
            modelFieldRegExp.current.push(modelFieldRegExpPattern);
            setReExport(nextReExp);
        }
    
    function removeReExportRawHandler(e) {
            var reIdx = e.target.parentNode.parentNode.getAttribute('reidx');
            let nextReExport = [...reExport];
    
            if (reExport.length > 1) {
                modelFieldRegExp.current.pop()
                nextReExport.splice(reIdx, 1);
                setReExport(nextReExport);
            }
        }
    
    let rowsReExp = reExport.map((item, index) => {
                let first = <tr key={index * 10} reidx={index} pidx={0} className='align-middle'>
                    <td rowSpan={reExport[index].product.length + 1}>
                        <div>
                            <Select
                                data={kodfito}
                                disabled={getKodfitoDisabled(index)}
                                name='kodfito'
                                value={reExport[index].kodfito}
                                handler={changeReExportHandler}
                                ref={modelFieldRegExp.current[index].kodfito.ref}
                            />
                        </div>
                        <div className='mt-1'>
                            <input type='text' className="form-control ms-1" name='num' value={reExport[index].num}
                                   onChange={changeReExportHandler} ref={modelFieldRegExp.current[index].num.ref}/>
                        </div>
                    </td>
                    <td rowSpan={reExport[index].product.length + 1}>
                        <input
                            type='date'
                            name='date'
                            className='form-control'
                            value={reExport[index].date}
                            onChange={changeReExportHandler}
                            ref={modelFieldRegExp.current[index].date.ref}
                        />
                    </td>
                    <td>
                        <Autocomplete data={getProductionByField(index, 0, 're')} search={getProduction}
                                      pIdx={0} outerIdx={index} name='production' section="re" value={reExport[index].product[0].production.value}
                                      choiceHandler={choiceAutocomplete} ref={modelFieldRegExp.current[index].product.production.ref}/>
                    </td>
                    <td>
                        <input type='text' className="form-control" name='netto' value={reExport[index].product[0].netto}
                               onChange={changeReExportProductHandler} ref={modelFieldRegExp.current[index].product.netto.ref}/>
                    </td>
                    <td>
                        <Select
                            data={units}
                            name='unit'
                            value={reExport[index].product[0].unit}
                            handler={changeReExportProductHandler}
                            ref={modelFieldRegExp.current[index].product.unit.ref
                        }/>
                    </td>
                    <td>
                        <Autocomplete data={getCountryByField(index, 0, 're')} search={getCountry}
                                      pIdx={0} outerIdx={index} name='country' section='re' value={reExport[index].product[0].country.value}
                                      choiceHandler={choiceAutocomplete} ref={modelFieldRegExp.current[index].product.country.ref}/>
                    </td>
                    <td style={{width: 110}} className='small-text'><span className='link hover' onClick={createFssHandler}>создать ФСС</span></td>
                    <td style={{width: 130}} className='small-text'><span className='link hover' onClick={addIntoFssHandler}>добавить в ФСС</span></td>
                    <td style={{width: 30}}><span className='link hover' onClick={removeProductRowExpHandler}>x</span></td>
                    <td rowSpan={reExport[index].product.length + 1} className='align-middle' style={{width: 30}}>
                        <span className='link hover' onClick={removeReExportRawHandler}>x</span>
                    </td>
                </tr>;
    
                let middle = getReExpProductsRows(index);
    
                let end = <tr key={index * 10 + 9} idx={index}>
                    <td colSpan='7' className='text-start position-relative'>
                        <span>Сумма: {sumProducts(reExport[index].product)}</span>
                        <span className="add-row" idx={index} onClick={addProductRowReExpHandler}>Добавить строку</span>
                    </td>
                </tr>;
    
                let delimiter = (index !== reExport.length - 1) ?
                    <tr key={index * 10 + 9.5}>
                        <td colSpan='10' className='delimiter'></td>
                    </tr> : null;
    
            return [first, middle, end, delimiter]
            }
        )
    
    return (
    <div className='card bg-light shadow-sm p-2 m-2 mt-3'>
                    <div className="row align-items-start">
                        <span className="col-sm-1 col-form-label">Описание товаров:</span>
                        <div className="col d-inline-flex">
                            <table className="table table-bordered mb-0">
                                <thead className='fs-6'>
                                <tr className='table-th'>
                                    <th style={{width: 220}}>Реэкспорт ФСС</th>
                                    <th style={{width: 150}}>Дата выдачи</th>
                                    <th>Товар</th>
                                    <th style={{width: 100}}>Нетто</th>
                                    <th style={{width: 100}}>Единицы</th>
                                    <th style={{width: 330}}>Страна происхождения (для 06 <br/>группы вводиить страну отправления)</th>
                                    <th colSpan='2'>Действия с ФСС</th>
                                    <th colSpan='2'>Удалить</th>
                                </tr>
                                </thead>
                                <tbody>
                                {rowsReExp}
    
                                <tr className='border border-0'>
                                    <td colSpan='10' className='delimiter border border-0 pt-1 pb-0'><span className='hover link' onClick={addReExportRawHandler}>Добавить реэкспортный ФСС</span></td>
                                </tr>
                                </tbody>
                            </table>
                        </div>
                    </div>
                </div>
    )
    Написано
  • Почему сбрасывается ref на элемент?

    svisch
    @svisch Автор вопроса
    WbICHA, прошу прощения - это риторический вопрос?
    Написано
  • Как правильно в Symfony десериализовать Request в DTO, а последний потом в сущность?

    svisch
    @svisch Автор вопроса
    Виктор Кожухарь, спасибо за рекомендации и объяснении. Обязательно почитаю про DDD. Кстати он у меня давно уже где-то в открытых вкладках в браузере "к прочтению", но все руки не дойдут - видимо пришло ее время)))
    Написано
  • Как правильно в Symfony десериализовать Request в DTO, а последний потом в сущность?

    svisch
    @svisch Автор вопроса
    tukreb, спасибо за участие в обсуждении. А не могли пояснить терминологию useCase в контексте моего вопроса пожалуйста?
    Написано
  • Как правильно в Symfony десериализовать Request в DTO, а последний потом в сущность?

    svisch
    @svisch Автор вопроса
    Спасибо за рекомендацию)
    А как быть в случае, если в сущности есть свойство-отношение? В DTO делать тип данных c типом данных id сущности (uuid или int, например) или же в DTO пытаться преобразовать входящие данные к типу этого отношения?
    Написано
  • Почему не правильно работает $_SERVER['REMOTE_ADDR']?

    svisch
    @svisch Автор вопроса
    AUser0, IvanU7n, спасибо за подсказки!
    Кстати, на счет почему в докере именно такое поведение даже без проксирующего внешнего апача вот, что нарыл о работе сети в докере и это в принципе проливает свет на мою проблему Тут . Вдруг интересно будет, ну или еще кто столкнется с этим))
    Так что буду дальше копать)
    Написано
  • Почему не правильно работает $_SERVER['REMOTE_ADDR']?

    svisch
    @svisch Автор вопроса
    IvanU7n, спасибо за информацию. Буду крутить, пробовать)
    Да и проверил - проксирующий апач видит адреса. Если я правильно понял систему это значит, что он должен иметь установленный модуль remoteip? А то когда гуглил проблему так и не понял оба апача должны иметь этот модуль или только серверный?)
    Написано
  • Почему не правильно работает $_SERVER['REMOTE_ADDR']?

    svisch
    @svisch Автор вопроса
    Кстати, только подумал, ведь у меня помимо описанной выше схемы есть еще и локально развернутый такой же контейнер без проксирующего apache также реагирует на эти глобальные переменные php. Только вместо 172.19.0.1 и 172.19.0.2 - 172.20.0.1 и 172.20.0.2. Может проблема не в прокси тогда?!
    Написано
  • Как выбрать нужные таблицы в Symfony используя schema_filter?

    svisch
    @svisch
    Кирилл, ну добавив один раз все и делая очередную миграцию вы можете видеть добавились ли новые в public и если да, то включить их в фильтр. Надо кстати самому как нибудь сесть и попробовать исключить его весь - все руки не доходят))

    shop_ это префикс таблиц, чтобы доктрина искала его в названиях, и если подходят, то учитывала.

    если вы указали shop_ в фильтре, то как раз созданную ранее таблицу доктрина возможно не видит и пытается создать новую. Попробуйте удалить это и снова создать миграцию.
    Написано
  • Как выбрать нужные таблицы в Symfony используя schema_filter?

    svisch
    @svisch
    Кирилл, главное думаю вы неправильно составили shema_filter. Зачем там shop_ и migrations_tables.shop_migrations?
    Вам надо оставить только вашу схему, а другие закрыть. Например:
    schema_filter: '~^(?!(public.some_table|some_sheme.|other_sheme.t_))~'


    Этим мы исключаем определенную таблицу в public схеме (кстати у меня регуляркой public. не получилось исключить все таблицы public, пришлось перечислять все, а вот для других схем это работало), все таблицы схемы some_sheme и таблицы начинающиеся с t_ в схеме other_sheme. Все остальные таблицы будут читаться доктриной
    Написано
  • Как выбрать нужные таблицы в Symfony используя schema_filter?

    svisch
    @svisch
    Кирилл, как вариант попробуйте задать другую таблицу для записи выполненных миграций в вашей схеме (по умоллчанию она в в public). Делается это в doctrine_migrations.yaml
    doctrine_migrations:
        migrations_paths:
            # namespace is arbitrary but should be different from App\Migrations
            # as migrations classes should NOT be autoloaded
            'DoctrineMigrations': '%kernel.project_dir%/migrations'
        enable_profiler: false
        storage:
            # Default (SQL table) metadata storage configuration
            table_storage:
                table_name: 'your_sheme.doctrine_migration_versions'

    типа этого что-то
    Написано
  • Стоит ли писать алгоритмы на PHP?

    svisch
    @svisch
    solokychechka, я настроил себе xdebug с vscode.
    мой пост тут как я решал эту проблему. Если не справитесь, пишите постараюсь помочь.
  • Как Yii2 связать с фронт проектом на react?

    svisch
    @svisch
    Попробуйте в разделе scripts заменить:
    "build": "react-scripts build"
    на
    "build": "react-scripts build && rm -rf '../web/dist' && mv build ../web/dist",

    и до dependencies вставить:
    "homepage": "localhost/dist"

    после этого пересоберите проект
  • Как Yii2 связать с фронт проектом на react?

    svisch
    @svisch
    RusticAnd, скорее всего что-то с подключением скриптов - не правильные пути. Покажите свой package.json