• Как преобразовать несколько массивов php в один?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    $input = [
      [2, 'скрипт холодного звонка по продаже услуг'],
      [2, 'продажи в переписке'],
      [2, 'автоматизация отдела продаж'],
      [2, 'заказать скрипт продаж'],
      [3, 'доставка еды из ресторана'],
      [3, 'еда из ресторана на дом'],
      [3, 'доставка еды из ресторана на дом'],
      [4, 'доставка товаров из китая в россию'],
      [4, 'купить в китае с доставкой в россию'],
      [4, 'доставка запчастей из китая в россию'],
    ];
    
    $output = [];
    
    foreach($input as $item) {
      if (!array_key_exists($item[0], $output)) {
        $output[$item[0]] = [];
      }
      $output[$item[0]][] = $item[1];
    }
    
    $output = array_map(fn($item) => join(', ', $item), $output);
    
    var_dump($output);
    Ответ написан
    1 комментарий
  • Разные экраны, разные разрешения фоновых картинок. Как?

    delphinpro
    @delphinpro Куратор тега HTML
    frontend developer
    body {
      background: black no-repeat / cover;
      background-image: var(--bg-image-mobile);
    }
    @media (min-width: 768px) {
      body {
        background-image: var(--bg-image-tablet);
      }
    }
    @media (min-width: 1200px) {
      body {
        background-image: var(--bg-image-desktop);
      }
    }


    <body style="
      --bg-image-mobile: url(/images/bg-image-mobile.jpg);
      --bg-image-tablet: url(/images/bg-image-tablet.jpg);
      --bg-image-desktop: url(/images/bg-image-desktop.jpg);
    ">
    
    </body>
    Ответ написан
    Комментировать
  • Как сделать роутинг для страниц, добавляемых через админку?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Считать из базы все слаги, динамически зарегистировать все возможные роуты.
    Считанные слаги кэшировать. Кэш обновлять по сохранению страницы в базе.
    Такой вариант дает возможность создавать в админке любые адреса, включая корневые.

    В качестве примера:
    class DynamicRoutes
    {
      public function routes(): void
      {
        /** @var Collection $pageCollection */
        $pageCollection = getFromCacheIf(config('cache.pages'), CACHE_PAGES, function () {
          try {
            return $this->getPages();
          } catch (\Exception $exception) {
            return new Collection();
          }
        });
    
        $pageCollection->each(function (Page $page) use ($pageCollection) {
    
          $routeName = ROUTE_PREFIX_PAGE.$page->slug;
          $routeUri = $page->getAttribute('url');
    
          $parentRouteName = $page->parent_id
            ? ROUTE_PREFIX_PAGE.($pageCollection->get($page->parent_id)->slug)
            : 'home';
    
          Route::prefix($routeUri)->group(function () use ($page, $routeName, $parentRouteName) {
    
            Route::get('', static function () use ($page) {
              return App::call($page->controllerName(), ['page' => Page::findOrFail($page->id)]);
            })
              ->name($routeName)
              ->breadcrumbs(function (Trail $trail) use ($page, $routeName, $parentRouteName) {
                return $trail->parent($parentRouteName)
                  ->push($page->localizedAttribute('title'), route($routeName));
              });
    
            switch ($page->controllerName()) {
              case GalleryController::class:
                $this->galleryRoutes($routeName);
                break;
              case TourController::class:
                $this->tourRoutes($routeName);
                break;
              case NewsController::class:
                $this->newsRoutes($routeName);
                break;
            }
    
          });
    
        });
      }
    
      private function galleryRoutes(string $parentRouteName): void
      {
        Route::get('{gallery:slug}', [GalleryController::class, 'show'])
          ->name(ROUTE_GALLERY)
          ->breadcrumbs(function (Trail $trail, Gallery $gallery) use ($parentRouteName) {
            return $trail->parent($parentRouteName)
              ->push($gallery->localizedAttribute('title'), route(ROUTE_GALLERY, $gallery));
          });
      }
    
      private function tourRoutes(string $parentRouteName): void
      {
        Route::get('{tour:slug}', [TourController::class, 'show'])
          ->name(ROUTE_TOUR)
          ->breadcrumbs(function (Trail $trail, Tour $tour) use ($parentRouteName) {
            return $trail->parent($parentRouteName)
              ->push($tour->localizedAttribute('title'), route(ROUTE_TOUR, $tour));
          });
      }
    
      private function newsRoutes(string $parentRouteName): void
      {
        Route::get('{news:slug}', [NewsController::class, 'show'])
          ->name(ROUTE_NEWS)
          ->breadcrumbs(function (Trail $trail, News $news) use ($parentRouteName) {
            return $trail->parent($parentRouteName)
              ->push($news->localizedAttribute('title'), route(ROUTE_NEWS, $news));
          });
      }
    
      private function getPages(): Collection
      {
        $pages = Page::whereNotNull('slug')->get()->keyBy('id');
    
        $pages->each(function (Page $page) use ($pages) {
          $page->setAttribute('url', $this->buildUrlForPage($page, $pages));
        });
    
        return $pages;
      }
    
      private function buildUrlForPage(Page $page, Collection $pages): string
      {
        if (!$page->parent_id) {
          return $page->slug;
        }
    
        $parentPage = $pages->get($page->parent_id);
    
        return $this->buildUrlForPage($parentPage, $pages).'/'.$page->slug;
      }
    }


    router/web.php
    //...
    app(DynamicRoutes::class)->routes();
    
    Route::fallback(function () {
      return response()->view('errors.404', [], 404);
    });
    Ответ написан
    Комментировать
  • В роутах Laravel больше нельзя указывать простое (короткое) название контроллера?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    По умолчанию неймспейсы для контроллеров в роутах отключены.
    Но вы можете их добавить сами в RouteServiceProvider
    Route::middleware('web')
                    ->namespace('App\\Http\\Controllers')
                    ->group(base_path('routes/web.php'));


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

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Если прямо так и написано, то ничего и не сохранится, $validatedData будет пуст. И зачем второй раз валидировать, если выше уже было?
    $validatedData = $request->validate([
                    // ... ваши правила валидации ...
                ]);


    Ну и здесь просто предположу
    $object = MyObject::create($validatedData);

    Чтобы модель получила данные, у нее должно быть заполнено поле $fillable. Модель не вижу, не знаю, как у вас.

    А так все выглядит вполне корректным.
    Ответ написан
  • PHPstorm как при открытии автоматически запустить "php artisan serve" и "npm run dev"?

    delphinpro
    @delphinpro Куратор тега PhpStorm
    frontend developer
    хз как автоматом.
    Можно попробовать создать конфигурацию запуска и выполнять ее нажатием кнопки
    spoiler
    64ef46e08dc88082912802.png
    Ответ написан
    Комментировать
  • Как идентифицировать и стилизовать начало параграфа без класса: по признаку комбинации общих символов?

    delphinpro
    @delphinpro Куратор тега HTML
    frontend developer
    document.addEventListener("DOMContentLoaded", () => {
    
      document.querySelectorAll('p').forEach(p => {
        if (p.textContent.startsWith('— ')) {
          p.classList.add('mdashstring');
        }
      });
    
    });
    Ответ написан
    3 комментария
  • Как внедрять html-шаблонизатор в gulp | webpack сборку?

    delphinpro
    @delphinpro Куратор тега Gulp.js
    frontend developer
    основные тезисы:
    1. шаблонизаторы при верстке очень помогают сэкономить время.
    2. pug - говно, потому что не html-френдли. Изобрели какой-то свой синтаксис и утверждают, что он лучше. В то время как весь интернет работает на html. хотите шаблонизатор, берите что то вроде twig (gulp-twig)
    3.колво загрузок может и показатель. но я никогда на него не смотрел. Работаю в этой области 10+ лет. Ни разу не обращал внимания.

    я узнал, pug, например, через расширения или терминал компилируется


    Большинство пакетов так и работает- через командную строку. например тот же шабдлонизатор twig/ Но gulp-twig - это уже обертка над основным пакетом, которую можно пихать в пайплайны галпа. То же самое с пагом. pug - основной пакет, работает через консоль, gulp-pug - обертка для работы в галпе.
    Ответ написан
    1 комментарий
  • Как во vue 3 написать свою реализацию v-if?

    delphinpro
    @delphinpro
    frontend developer
    а v-if на template?

    <template v-if="cond">
      <div>  <!-- не будет смонтирован -->
      </div>
    </template>
    Ответ написан
    1 комментарий
  • Почему $array=$sql-&amp;amp;amp;gt;fetch(PDO::FETCH_ASSOC). Возвращает false не зависимо от того что я написал в форму?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    У вас как процедура регистрации выгляит? Вы что, прямо вот так храните в базе данных пароль в открытом виде?
    Или все-таки храните хэш от пароля, сгенерированный функцией password_hash?
    Если храните хэш, то зачем вы пытаетесь найти в базе пароль в том виде, как он был введен в форму?

    По поводу принципов регистрации/авторизации вот здесь ознакомьтесь
    https://habr.com/ru/articles/665602/
    Специально для новичков писал.
    Ответ написан
    Комментировать
  • Как сделать прокрутку ограниченной по размерам?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Для любого элемента
    .somediv {
      height: 200px;
      overflow: auto;
    }
    Ответ написан
    Комментировать
  • Почему на сервере не загружается таблица sqlite?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    no such table


    Черным по белому написано - такой таблицы в базе нет. Почему нет? Разбирайтесь.

    Пробовала в контроллер добавить use RefreshDatabese


    Зачем? Это используется в тестировании для очистки базы перед тестом. Для очистки, Настя! Может поэтому там и нет нужных таблиц.
    Ответ написан
    2 комментария
  • Существует ли отдельная категория шаблонов для текстовых сайтов?

    delphinpro
    @delphinpro
    frontend developer
    HTML по своей сути ориентирован на текст.
    Грубо говоря безо всяких шаблонов, и без CSS, используя только HTML вы вполне можете организовать структурированную текстовую страницу.

    <h1>Заголовок</h1>
    <p>Текст, много текста</p>
    <ul>
      <li> пункт списка 1</li>
      <li> пункт списка 2</li>
      <li> пункт списка 3</li>
    </ul>


    и т.д.
    Ответ написан
  • Можно ли передавать CSS классы через props?

    delphinpro
    @delphinpro
    frontend developer
    я так понимаю, ваш класс меняет состояние компонента. Передавать состояние компонента через пропсы нормально.
    Однако я бы напрямую может и не стал так делать.
    Лучше передать само состояние, и внутри компонента назначить класс

    Плохо
    props: {
      'class': String
    }


    Лучше
    props: {
      disabled: Boolean
    }
    
    <div :class={disabled: disabled}>


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

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Пытаюсь изучать html и css.

    Отлично.
    Но вам совершенно обязательно параллельно с изучением научиться пользоваться поисковой системой.
    В самом начале пути уясните – на все тривиальные вопросы уже даны тысячи ответов:
    https://yandex.ru/search/?text=выравнивание+в+css&...
    Ответ написан
    Комментировать
  • Как повесить событие, чтобы оно сработало на динамически созданном объекте?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    у вас неточность. в примере на jquery вы просто ловите событие
    а в примере на ваниле хотите инициализировать плагин.

    Это разные вещи.

    Поймать событие просто. Вешайте обработчик на document и смотритте что прилетело в event.target

    В случае с плагином, если он сам не поддерживает инициализацию на созданных в рантайме элементах, вам придется самостоятельно отслеживать появление новых узлов в DOM и по условиям инитить на них плагин. Но это в общем случае, для универсальности. В частном случае можно вклинится в процедуры открытия тех же попапов и там подключать маску. Например напрямую в клике кнопки "Открыть попап", или удобнее, в обработчике события "popup.opened" (условно, я не знаю, какие попапы у вас используются, но у большинства плагинов есть события открытия/закрытия).
    Ответ написан
    Комментировать
  • Как получить координаты элемента относительно его родителя?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    что то вы гоните

    https://api.jquery.com/position/
    .position()

    Description: Get the current coordinates of the first element in the set of matched elements, relative to the offset parent.
    Ответ написан
    1 комментарий
  • Как обойти на чужом сайте onselectstart="return false"?

    delphinpro
    @delphinpro Куратор тега HTML
    frontend developer
    набрать в консоли

    document.body.onselectstart = () => true;
    // или 
    document.body.onselectstart = null;
    Ответ написан
    9 комментариев
  • Количество одновременно загружаемых файлов PHP?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    https://www.php.net/manual/ru/ini.core.php
    один пользователь одновременно может загружать столько файлов, сколько указано в этой настройке.
    Ответ написан
  • Как вывести сумму двух текстовых полей?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Это базовые особенности языка. Объясняются в любом учебнике.
    В джаваскрипт оператор "+" является двойственным. В зависимости от ситуации он может быть как оператором сложения (чисел), так и оператором конкатенации (склеивание строк).

    Здесь оба операнда являются строками, поэтому знак плюс будет оператором конкатенации.
    let s1 = '1';
    let s2 = '2';
    console.log(s1 + s2); // '12'


    Здесь оба операнда являются числами, поэтому знак плюс будет оператором сложения.
    let n1 = 1;
    let n2 = 2;
    console.log(n1 + n2); // 3


    Могут быть ситуации, когда один из операндов будет числом, а другой – строкой.
    В этом случае числовой операнд будет преобразован в строку
    let s1 = '1';
    let n2 = 2;
    console.log(s1 + n2); // '12'


    Когда вы получаете значения инпутов со страницы, они всегда будут строчного типа, во всех ситуациях. Поэтому, прежде чем выполнять над этими значениями математические операции, их нужно преобразовать в числа
    parseInt() - в целое число
    parseFloat() - в число с плавающей точкой
    Number() - можно еще так
    +n2 - или так (это уже своего рода хак, основанный на приведении типов)

    Number(element1.innerHTML) + Number(element2.innerHTML)


    Все подробности здесь https://learn.javascript.ru
    Ответ написан
    Комментировать