• Как хранить большие JSON массивы, которые постоянно обновляются (API)?

    @rPman
    Задать сначала вопрос нужно, как именно используются полученные данные.

    Только ли для чтения или возможны изменения, или изменения только те что приходят от озона (т.е. вопрос, будут ли меняться данные после того как получены от озона)? есть ли поиск и фильтрация данных? Многопользовательский ли доступ или сервис для себя? Ожидается ли серьезная переделка в будущем с расширением функционала или это код на один раз, как часть эксперимента?

    А сами данные, в формате, получаемом от озона нужны в совместимом формате (не нужна ли агрегация данных с нескольких запросов?)?

    Тут конечно рекомендуют использовать базы данных, но в некоторых случаях это может оказаться оверкилом, и возможно, тебе будет достаточно хранить полученные данные прямо как есть в файлах (не объединяя их), и при запросе, просто считывать их полностью (можно сразу после получения данных, делать по ним индекс и складывать рядом тоже в файл)

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

    Но стоит только этим данным начать меняться, или количество данных станет несоизмеримо больше чем однократно запрашиваемые, индексные файлы и код работы с ними станут сложнее и станет проще перенести все данные в sql базу.

    p.s. я воспринимаю хранение в файлах как использование nosql база данных, тем более что это очень даже быстро, и даже если хранение данных в режиме много файлов в одной записи

    p.p.s. хранение файлов в php формате (var_export) и подключение их include может оказаться самым быстрым способом из всех возможных, для readonly 'баз данных' (json или serialize медленнее в полтора два раза).
    upd. мне тут подсказали что есть еще более быстрый сериализатор php - igbinary и входит в поставку того же debian/ubuntu
    Ответ написан
  • Как создать универсальное расширение для сайтов?

    maksim92
    @maksim92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    1. Этот вариант в принципе хорошо применим для более современных фреймворков, но Yii2 достаточно старый. Он не поддерживает PSR стандарты из-за которых он очень плохо совместим с другими. То есть для Yii написать такой модуль и подключить к симфонии невозможно, так же как и наоборот. К тому же на Yii используется Active Record, а на Symfony Doctrine. Поэтому вам можно вынести только какие-то компоненты и подключать их в своих проектах. С отдельным модулем будет сложно. Модуль Yii можно будет использовать только там. Если вы пойдёте таким способом, то вам нужно вынести этот пакет в репозиторий и подключать этот пакет через композер. Внутри проекта останется настроить конфиг, настроить зависимости через DI. Пример.

    2. Второй вариант более гибче. Это уже больше про микросервисы. Приложения будут взаимодействовать через API. В таком случае вам вообще без разницы какой там фреймворк и база. Современные большие системы именно так и устроены. Однако это сложна система, на которую требуется много знаний и времени.

    На вашем месте, проектируя на Yii2 я бы не стал об этом париться. Во-первых, этот иодвль врят ли кому будет нужен. Во-вторых, он не совместим с другими фреймворками. Если вам требуется такой модуль - просто копируйте его в другой проект. Если почувствуете, что часто изменяется и нужна совместимость с другими проектами - выносите в пакет и подключайте через композер.
    Ответ написан
  • Правильно ли создавать таблицу для хранения одной записи?

    @Nolan81
    программист
    Вы можете завести для таких вещей отдельную таблицу настроек:
    id name value
    где в поле value типа text хранить серилизованное значение любой настройки.

    Да и расширений таких должно хватать.
    Ответ написан
  • Как реализовать динамическую генерацию CSS классов на PHP?

    @strelok011
    Не довелось применять, только слышал о новом подходе в использовании css, причем эта технология позволяет очень значительно сжать итоговый файл со стилями (на больших проектах).
    Суть такова - проект создается в классическом произвольном режиме, именуете классы как удобно, на выходе компилятор разбирает все классы, приводит к набору базовых атрибутов. То есть на выходе будет стиль вида 'a ab sc o', каждый класс отвечает только за один атрибут. Их конечное и не очень большое число, выгода на больших проектах очевидна, так же смысл парсить результат сводится к 0. В итоге, если не ошибаюсь, размер css файла порядка сотни кб, тогда как на крупных проектах может достигать не одного мегабайта, размер html разметки остается вполне вменяемым.
    Годится только для продакшн-релиза.

    P.S. Источник не подскажу.
    Ответ написан
  • Как реализовать динамическую генерацию CSS классов на PHP?

    ArsenyMatytsyn
    @ArsenyMatytsyn Куратор тега CSS
    CEO iAmStudio, предприниматель.
    Отложенная загрузка + intersectionObserver + JS-фреймворк + адовые анимации в ответ на fetch тебе в этом больше помогут, чем подобные извращения. В снижении риска быть спарсенным. Да и оптимизируешь возможно слегонца.
    Ответ написан
  • Как реализовать динамическую генерацию CSS классов на PHP?

    profesor08
    @profesor08 Куратор тега PHP
    https://styled-components.com/ - прям на главной редактируй код и смотри что происходит с кнопками. Там же ты поймешь, что твоя задумка гораздо сложнее и ее решение лежит в другой плоскости, и требует специальной подготовки кода и подхода к разработке, основанном на компонентах. PHP же тут просто мимо проходил и его тегом зацепило.
    Ответ написан
  • Как лучше всего организовать поиск в тексте на сайте?

    anton_reut
    @anton_reut
    Начинающий веб-разработчик
    "То есть я получил текст с сайта" - и где в этот момент живет этот текст? В некой временной tmp переменной? Мне кажется нет разницы хранить инфу для поиска во временном файле или в базе - всё равно тебе надо где то её иметь.
    Ответ написан
  • Как лучше всего организовать поиск в тексте на сайте?

    BojackHorseman
    @BojackHorseman Куратор тега PHP
    ...в творческом отпуске...
    То есть я получил текст с сайта, затем каким то образом выполнил поиск по этому тексту (не ясно как).


    а никак. чтобы этот поиск выполнить и нужно построить индексы. вся суть полнотекстовых движков в их (индексах) построении.

    Будет постоянное переписывание индексов, слишком большая нагрузка (возможно).


    будет. но это задача в своей постановке попроще нечеткого поиска
    Ответ написан
  • Yii2. Как реализовать реферальную систему?

    maksim92
    @maksim92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    А если вы забудете где-то наследоваться от этого контроллера? Можно вам решить и без наследования от основного контроллера. Вешайте обработчик на всё приложение используя before или after:

    'as beforeAction' => function () {
    //Тут ваши действия для анонимной функции
    }


    Если логики много используйте отдельный класс, например, поведения. Но поведения уберут в Yii3. Думайте об этом тоже)
    'as beforeAction' => [
            'class' => app\modules\users\behaviors\LastVisitBehavior::class
        ],

    Очищать URL от нужного параметра можно с
    Url::current(['ref' => null]);

    PS Мне кажется, что не надо делать реферальную ссылку на все экшены. Врядли пользователь будет менять ссылку. Да и зачем вам это учитывать. Дают рабочую ссылку на регистрацию. Там вы ищите нужный параметр. Запоминаете его и уже при регистрации всегда подставляете если есть. Но зачем вам рефералка в новостях, статьях и так далее. Не пойму целесообразность решения)

    Обычно делают как то так:
    /**
         * Страница сохранения реферера (пригласившего)
         *
         * @param int $id
         *
         * @return Response|string
         */
        public function actionReferral(int $id)
        {
            if (Yii::$app->user->isGuest) {
                ReferralHelper::setReferrerId($id);
            }
            return $this->redirect('site/registration');
        }


    /**
         * Страница регистрации
         *
         * @return Response|string
         * @throws \yii\base\InvalidArgumentException
         * @throws \yii\db\Exception
         */
        public function actionRegistration()
        {
            if (!Yii::$app->user->isGuest) {
                return $this->goHome();
            }
            $userForm = new UserForm();
            if ($userForm->load(Yii::$app->request->post())) {
                $referrerId = ReferralHelper::getReferrerId();
                $referrer = $referrerId !== null ? $this->getUser((int)$referrerId) : null;
                $userForm->setReferrer($referrer);
                if ($userForm->save() && $userForm->login()) {
                    $message = 'Спасибо за регистрацию.';
                    if ($referrer !== null) {
                        $message .= ' Вас пригласил ' . $referrer;
                    }
                    Yii::$app->session->setFlash('success', $message);
                    ReferralHelper::removeReferrer();
                    return $this->goHome();
                }
                $this->addErrorForForm($userForm);
            }
            $userForm->password = '';
            return $this->render('registration', [
                'model' => $userForm,
            ]);
        }


    class ReferralHelper
    {
        const KEY_REFERRER_ID = 'referrer_id';
        public static function setReferrerId(int $referrerId)
        {
            \Yii::$app->getSession()->set(self::KEY_REFERRER_ID, $referrerId);
        }
        public static function getReferrerId()
        {
            return \Yii::$app->getSession()->get(self::KEY_REFERRER_ID, null);
        }
        public static function removeReferrer()
        {
            return \Yii::$app->getSession()->remove(self::KEY_REFERRER_ID);
        }
    }


    Взял из готового решения на Yii2. Код не совсем хороший, но рабочий.
    Ответ написан
  • Почему не работает поиск в элементе (библиотека DiDOM)?

    @DanKud
    Я не знаю этой библиотеки, но не думаю, что она кардинально отличается от других. Вам же показывает ошибку, что метод html() не может быть вызван на массиве. Методом find() вы получаете массив, если даже он находит всего один элемент, это все-равно будет массив. Попробуйте так:
    .....
    $competitionName = $item->find('.класс внутри выборки')[0]->html();
    .....
    Ответ написан
  • Почему не работает запрос в yii2?

    webinar
    @webinar Куратор тега Yii
    Учим yii: https://youtu.be/-WRMlGHLgRg
    имя таблицы Repair не вставили
    ->leftJoin('CheckList', 'CheckList.check_id = repair_table_name.' . $check->id)

    проверьте имена таблиц, что бы совпадали
    Ответ написан
  • Где в Yii2 файлы ошибок 404 и 403(хочется перевести эти страницы)?

    Isolution666
    @Isolution666
    творческая личность
    Здравствуйте товарищи программисты.
    ---
    Не так страшен код, как его трактуют ))
    Подсказку к этому вопросу как ни странно, я нашёл в папке "views/site/"
    Файл: error.php
    ===
    Разработчики поняли, что программисты столкнуться с таким вопросом, поэтому оставили подсказки:
    <?php
    
    use yii\helpers\Html;
    
    /* @var $this yii\web\View */
    /* @var $name string */
    /* @var $message string */
    /* @var $exception Exception */
    
    $this->title = $name;
    ?>


    Из них мы видим, что переменную <?=$name?>
    нам даёт <?=$this->title;?>
    А свалился этот нейм на наши головы из класса View !
    Проведя рефакторинг, я понял, что за <?=$message;?>
    Отвечает языковой пакет Yii2/
    А именно. /vendor/yiisoft/yii2/messages/ru/
    Если конечно вы в конфиге файла main.php указали русский язык. Там их куча, вы можете в этом убедится, да и сам класс показал, что используется модель подставки сообщений, через конструкцию: <?=Yii::t('yii','значение');?>

    Вы спросите, а нахера такой геморрой нужен??

    Отвечаю, во-первых, это не геморрой, а очень даже классное решение! Убивает сразу двух зайцев наповал! Мультиязычность - раз, Повторяющиеся элементы - два! Благодаря такому решению не надо ковырять весь код, достаточно заменяющие элементы заменить такой конструкцией, и всё, поменял текст или дизайн кнопки "обновить", сделал это в одном месте, в файле yii.php и всё, дизайн и текст поменялся во всём сайте, а отредактировали один файл!!! Это невероятно удобно. Так и с ошибками и с сообщениями, зачем писать на каждой страничке ручками "ваше сообщение успешно отправлено", если можно прописать значение = перевод. Так вот, в голове кода была ещё одна подсказка /* @var $exception Exception */
    и в самом классе ссылка на мануал php7 - php.net/manual/ru/exception.getmessage.php

    Таким образом мы имеем:
    class HttpException extends UserException
    {
        /**
         * @var int HTTP status code, such as 403, 404, 500, etc.
         */
        public $statusCode;
    
    
        /**
         * Constructor.
         * @param int $status HTTP status code, such as 404, 500, etc.
         * @param string $message error message
         * @param int $code error code
         * @param \Exception $previous The previous exception used for the exception chaining.
         */
        public function __construct($status, $message = null, $code = 0, \Exception $previous = null)
        {
            $this->statusCode = $status;
            parent::__construct($message, $code, $previous);
        }
    
        /**
         * @return string the user-friendly name of this exception
         */
        public function getName()
        {
            if (isset(Response::$httpStatuses[$this->statusCode])) {
                return Response::$httpStatuses[$this->statusCode];
            } else {
                return 'Error';
            }
        }
    }

    Ну так, раз мы можем указать код ошибки, public $statusCode;
    То можно тупо и условия поставить, например:
    <?=($exception->statusCode == '404') ? $this->title = "Ошибка 404" : ''; ?>
    <?=($exception->statusCode == '403') ? $this->title = "Доступ запрещён" : ''; ?>
    <?=($exception->statusCode == '500') ? $this->title = "Внутренняя ошибка сервера" : ''; ?>

    А текст ошибки под заголовком редактируется в языковом пакете:
    /vendor/yiisoft/yii2/messages/ru/yii.php
    $message

    <?php
    return [
    ...
    'Page not found.' => 'Страница не найдена.',
    'You are not allowed to perform this action.' => 'Вам не разрешено производить данное действие.',
    'An internal server error occurred.' => 'Возникла внутренняя ошибка сервера.',
    ...
    ];

    Выводится как <?=Yii::t('yii', 'Page not found.');?> и т д...
    Но вам выводить ничего не надо, класс сам определит код ошибки и выведет её текст.
    Как заменить заголовок ошибки я уже написал выше.

    --
    Это был полный разбор страницы ошибок, благодарю всех за внимание. Пока :)
    Ответ написан
  • Как выполнить задачу по расписанию в Yii2?

    OKyJIucT
    @OKyJIucT
    Sunshine reggae
    Указывайте полный путь к файлу yii, что в корне лежит. Можете посмотреть его с помощью функции
    echo dirname(__FILE__);
    Ответ написан
  • Как выбрать сегодняшние записи в Yii2?

    BojackHorseman
    @BojackHorseman
    ...в творческом отпуске...
    вы то привели в результирующей выборке к дате. а вот в where все равно сравниваете с timestamp, который содержит и время тоже

    правильный запрос для mysql

    SELECT *
    FROM tablename
    WHERE `date` >= UNIX_TIMESTAMP(CURDATE())
    Ответ написан
  • Как сверстать подобное?

    tema_sun
    @tema_sun
    Картинка выглядит векторной. Так чего бы svg не использовать?
    Ответ написан
  • Как сверстать подобное?

    twobomb
    @twobomb
    Canvas мне кажется легче всего и производительность в норме.
    Ответ написан
  • Как сверстать подобное?

    @cluberr
    Определить абсолютные координаты и радиус каждого кружка, определить градиенты, тени и порядок наложения расставить кружки , раскрасить , определить z-индексы , основной блок сделать оверфлоу хайден...
    Ответ написан
  • Как сверстать подобное?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Правильнее - нарисовать всё в векторе (SVG) и потом уже добавить другие DOM-обекты (или растровые изображения, например, лого).
    Ответ написан