Задать вопрос
  • Обработчик события на клавишу Enter в React?

    @awenn2015
    JastaFly, о какое фиче, это базовые вещи в реакте
  • Почему я вижу изменения стейта сразу после его обновления?

    @awenn2015 Автор вопроса
    WbICHA, не могу догнать как стейт то менять тогда, если придерживаться стиля setState(prev => [...prev, // Что тут?])

    Если только так, но зачем по всему списку проходить, тягомотина какая то

    setData((prev) => prev.map((it, i) => {
          return index !== i ? it : {
            ...it, [key]: value
          }
        }))
  • Как поменять порядок элементов в массиве?

    @awenn2015
    Александр, в ответы кинь, зачем ответ в комментарии выкладывать :-)
  • Как поменять порядок элементов в массиве?

    @awenn2015
    Алан Гибизов, не особо мне нравится перекладывание всего и вся на ии
  • Почему я вижу изменения стейта сразу после его обновления?

    @awenn2015 Автор вопроса
    WbICHA, а, точно же, совсем не подумал про это и react ошибок или предупреждений не выдавал, пытался сначала так сделать но видимо не правильное решение

    const changeDT: ChangeDateTime = (type, value, index) => {
        setData((prev) => {
          return [
           ...prev,
          [index]:  { ...prev[type]: value }
         ]
        })
      }
  • Как поменять порядок элементов в массиве?

    @awenn2015
    Алан Гибизов, Вообще по идее правильно говорите, я помню делал похожие задачи и решил немного освежить память, не потому что помочь хочется а просто интересно стало повторить
  • Почему отправка application/json через axios вызывает CORS-ошибку?

    @awenn2015
    хороший ответ, вопрос только в том как их настроить
  • Как лучше выстроить связи таблиц в бд на основе json файла?

    @awenn2015 Автор вопроса
    Akina, хотя по счет динамических атрибутов не совсем понял, данные фиксированные и используются только в таком виде, (админка + фронт) там лендинг на котором могут отображаться разные данные в зависимости от конфига
  • Делает ли react-router-dom v6 редиректы при загрузке страницы?

    @awenn2015 Автор вопроса
    szQocks, мм, понял, спасибо за ответ, странно конечно, будем смотреть тогда что там в реакте творится
  • Как лучше выстроить связи таблиц в бд на основе json файла?

    @awenn2015 Автор вопроса
    Да, это собственно я и так уже понял) я спрашивал за структуру, хотя наверно уже чисто советы хочу увидеть по самой orm и по своей структуре которую набросал, порядком конечно времени потратил (часа 3-4) что бы что создавались записи по всем этим данным, только странно что по времени само создание долго длиться (секунд 45-55), скорее всего придется в этом моменте отказываться от orm и писать на чистом sql, на rebeenphp получился такой код (больно длинный но что поделать)

    $path = 'http://example.loc/data/sovremennye-torshery.json';
      $data = json_decode(file_get_contents($path), true);
      $tablePrefix = "configs";
      
      $withPrefix = function (string $key) use ($tablePrefix) {
        return "{$tablePrefix}_" . strtolower($key);
      };
      
      /* Основа */
      
      $userId = 4;
      $user = R::load('users', $userId);
      
      /** @var null|OODBBean|OODBBean[] $config */
      $config = R::xdispense($tablePrefix);
      $user["ownConfigList"][] = $config;
      
      $config["name"] = "Sovremennye torshery";
      $config["description"] = null;
      $config["file"] = "sovremennye-torshery";
      $config["added"] = "2022-11-07T00:46:15+03:00";
      $config["modified"] = "2022-12-14T18:03:32+03:00";
      $config["author"] = $user["login"];
      
      /* Модули => metaInfo */
      
      $dataKey = "metaInfo";
      $cSiteMetrics = R::xdispense($withPrefix($dataKey));
      
      $cSiteMetrics[$tablePrefix] = $config;
      
      $cSiteMetrics["title"] = $data[$dataKey]["title"];
      $cSiteMetrics["description"] = $data[$dataKey]["description"];
      $cSiteMetrics["keywords"] = $data[$dataKey]["keywords"];
      
      /*  Модули => siteMetrics */
      
      $dataKey = "siteMetrics";
      $cMetaInfo = R::xdispense($withPrefix($dataKey));
      
      $cMetaInfo[$tablePrefix] = $config;
      
      $cMetaInfo["head"] = $data[$dataKey]["head"];
      $cMetaInfo["footer"] = $data[$dataKey]["footer"];
      
      /*  Модули => siteInfo */
      
      $dataKey = "siteInfo";
      $cSiteInfo = R::xdispense($withPrefix($dataKey));
      
      $cSiteInfo[$tablePrefix] = $config;
      
      $cSiteInfo["description"] = $data[$dataKey]["description"];
      $cSiteInfo["phone"] = json_encode($data[$dataKey]["phone"]);
      $cSiteInfo["currencySymbol"] = $data[$dataKey]["currencySymbol"];
      
      /*  Модули => preview */
      
      $dataKey = new KeyStruct("preview", [
        new KeyStruct("listPreview"),
        new KeyStruct("linksToOtherProducts")
      ]);
      
      // configs
      
      $LPKey = $dataKey->bound[0]->key;
      $LTOPKey = $dataKey->bound[1]->key;
      
      $cPreview = R::xdispense($withPrefix($dataKey->getKey()));
      $cPreview[$tablePrefix] = $config;
      
      $cPreview["titleForm"] = $data[$dataKey->key]["titleForm"];
      $cPreview["titlePreview"] = $data[$dataKey->key]["titlePreview"];
      $cPreview["listImage"] = $data[$dataKey->key]["listImage"];
      $cPreview["imageRight"] = $data[$dataKey->key]["imageRight"];
      $cPreview["backgroundImage"] = $data[$dataKey->key]["backgroundImage"];
      
      // bound tables
      
      foreach ($data[$dataKey->key][$LPKey] as $item) {
        $cPreviewLP = R::xdispense($withPrefix($dataKey->getBoundKey(0)));
        $cPreview["ownListPreviewList"][] = $cPreviewLP;
        
        $cPreviewLP["text"] = $item["text"];
      }
      
      foreach ($data[$dataKey->key][$LTOPKey] as $item) {
        $cPreviewLTOP = R::xdispense($withPrefix($dataKey->getBoundKey(1)));
        $cPreview["ownLinksToOtherProductsList"][] = $cPreviewLTOP;
        
        $cPreviewLTOP["text"] = $item["text"];
        $cPreviewLTOP["link"] = $item["link"];
      }
      
      /* Модули => why */
      
      $dataKey = "why";
      
      foreach ($data[$dataKey] as $item) {
        $cWhy = R::xdispense($withPrefix($dataKey));
        $config["ownWhyList"][] = $cWhy;
        
        $cWhy["text"] = $item["text"];
        $cWhy["image"] = $item["image"];
      }
      
      /* Модули => catalog */
      
      $dataKey = "catalog";
      $cCatalog = R::xdispense($withPrefix($dataKey));
      
      $cCatalog[$tablePrefix] = $config;
      
      $cCatalog["title"] = $data[$dataKey]["title"];
      $cCatalog["productsFile"] = $data[$dataKey]["productsFile"];
      $cCatalog["filterSticky"] = $data[$dataKey]["filterSticky"];
      $cCatalog["loadingModeNewProducts"] = $data[$dataKey]["loadingModeNewProducts"];
      
      /* Модули => discount */
      
      $dataKey = "discount";
      $cDiscount = R::xdispense($withPrefix($dataKey));
      
      $cDiscount[$tablePrefix] = $config;
      
      $cDiscount["title"] = $data[$dataKey]["title"];
      $cDiscount["subtitle"] = $data[$dataKey]["subtitle"];
      $cDiscount["image"] = $data[$dataKey]["image"];
      
      /*  Модули => lider */
      
      $dataKey = new KeyStruct("lider", [
        new KeyStruct("blocks"),
      ]);
      
      // configs
      
      $blocksKey = $dataKey->bound[0]->key;
      
      $cLider = R::xdispense($withPrefix($dataKey->getKey()));
      $cLider[$tablePrefix] = $config;
      
      $cLider["title"] = $data[$dataKey->key]["title"];
      $cLider["subtitle"] = $data[$dataKey->key]["subtitle"];
      
      // bound table
      
      foreach ($data[$dataKey->key][$blocksKey] as $item) {
        $cLiderBlock = R::xdispense($withPrefix($dataKey->getBoundKey(0)));
        $cLider["ownBlocksList"][] = $cLiderBlock;
        
        $cLiderBlock["image"] = $item["image"];
        $cLiderBlock["text"] = $item["text"];
        $cLiderBlock["title"] = $item["title"];
      }
      
      /* Модули => footer */
      
      $dataKey = "footer";
      $cFooter = R::xdispense($withPrefix($dataKey));
      
      $cFooter[$tablePrefix] = $config;
      $cFooter["copyright"] = $data[$dataKey]["copyright"];
      
      /* Модули => options */
      
      $baseOption = [
        "useCatalogSection",
        "manualHTMLStructure",
        "orderManualStructure",
        "bodyClass"
      ];
      
      $dataKey = "landOptions";
      
      foreach ($baseOption as $key) {
        $value = $data[$dataKey][$key];
        
        $cOptions = R::xdispense($withPrefix("options"));
        $config["ownOptionList"][] = $cOptions;
        
        $cOptions["name"] = $key;
        $cOptions["value"] = $value;
      }
      
      /* Модули => options => rootCategories */
      
      foreach ($data[$dataKey]["rootCategories"] as $cat) {
        $cProductCats = R::xdispense($withPrefix("categories"));
        $config["ownCategoriesList"][] = $cProductCats;
        
        $cProductCats["slug"] = $cat["slug"];
        $cProductCats["image"] = $cat["image"];
        $cProductCats["title"] = $cat["title"];
        $cProductCats["url"] = $cat["url"];
      }
      
      /* Модули => options => rootAttributes */
      
      foreach ($data[$dataKey]["rootSubCategories"] as $category) {
        $cProductAttrs = R::xdispense($withPrefix("attributes"));
        $config["ownAttributesList"][] = $cProductAttrs;
        
        $cProductAttrs["title"] = $category["title"];
        $cProductAttrs["count"] = count($category["subCategories"]);
        
        foreach ($category["subCategories"] as $property) {
          $cProductAttrProps = R::xdispense($withPrefix("attribute_props"));
          $cProductAttrs["ownPropsList"][] = $cProductAttrProps;
          
          $cProductAttrProps["slug"] = $property["slug"];
          $cProductAttrProps["title"] = $property["title"];
          $cProductAttrProps["revers"] = (bool) $property["revers"];
        }
      }
      
      /*  */
      
      R::storeAll([
        $cSiteMetrics,
        $cMetaInfo,
        $cPreview,
        $cCatalog,
        $cDiscount,
        $cLider,
        $cFooter,
        $config,
        $user
      ]);
  • Делает ли react-router-dom v6 редиректы при загрузке страницы?

    @awenn2015 Автор вопроса
    szQocks, то есть при попадании в админку токен сто процентов есть и естественно сам редиректов если все ок я не добавлял, удаляется он на простую проверку

    if (empty($cookie)) {]

    то есть по логике в самом роутере есть какие то внутренние редиректы в которых куки теряются
  • Делает ли react-router-dom v6 редиректы при загрузке страницы?

    @awenn2015 Автор вопроса
    szQocks, токен удаляется если в куках ничего нет, соответственно после авторизации я кладу в куки токен и при редиректе на авторизированную зону делаю проверку a: на его существование и b: на его валидность, если что то из этого не так редирект на страницу логина и удаление токена из базы, тестил с пустой админкой без реакта все нормально работает, как только подкидываю приложение сразу сноситься так что читай внимательнее прежде чем делать глупые замечания)
  • Стоит ли писать let, const?

    @awenn2015
    WapSter, я уже давно как то привык по умолчанию const писать и стараюсь очень редко юзать let, максимум для скалярных типов которые буд менять где то, не думал что кто то не понимает этого
  • Стоит ли писать let, const?

    @awenn2015
    profesor08, да то что это признак дурного тона)
  • Стоит ли писать let, const?

    @awenn2015
    Всегда по возможности стоит использовать const кроме случаев когда это скалярный тип и вы его точно собираетесь менять, тогда можно let, объекты с массивами можно изменять и внутренними методами, а от использования var лучше воздержаться
  • Как сгенерировать случайное число для кода подтверждения?

    @awenn2015 Автор вопроса
    ThunderCat, видимо mongo откисает, заблочились гады, попробуем тогда firebase, про sqlite глянул но какой то он не понятный, даже хз чего с ним делать и как ставить
  • Как сгенерировать случайное число для кода подтверждения?

    @awenn2015 Автор вопроса
    ThunderCat, mongodb тогда тоже в ту же коллекцию, ее наверно и опробую если можно с php подружить
  • Как сгенерировать случайное число для кода подтверждения?

    @awenn2015 Автор вопроса
    ThunderCat, да я как то даже и не думал по счет облачный решений, я их почему то с nodejs соотношу, нужно попробовать, плюс по счет перебора я решил тогда для безопасности стоит jwt токен генерировать с жизнью минут на 5 максимум, спасибо за толковые ответы