За последние 24 часа нас посетили 20402 программиста и 1091 робот. Сейчас ищут 800 программистов ...

Как скормить PHP слишком "человеческие" данные?

Тема в разделе "PHP для профи", создана пользователем Anaksagor, 29 июн 2021.

Метки:
  1. Anaksagor

    Anaksagor Активный пользователь

    С нами с:
    21 ноя 2017
    Сообщения:
    21
    Симпатии:
    0
    Приветствую всех. Мне необходимо создать функционал, предоставляющий студенту ачивки за некие достижения, вроде: "10 заданий выполнены на 10 баллов", "доля оценок выше 9 больше 90%", "сдано с первого раза" и любая другая (или почти любая), которая может быть придумана менеджером. Я ломаю голову, как эти ачивки динамически в админке создавать, как хранить в бд само условие ачивки, по какой идее в коде их обрабатывать, когда наступает условие достижения ачивки?
    Может как-то динамически триггеры бд создавать из php, но как превращать человеческое "10 заданий выполнены на 10 баллов" в SQL?
    За любые идеи буду признателен.
    Спасибо!
     
  2. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    А у них много вариантов?
    Разобрать согласно заранее созданному словарю.
    Пример
    https://www.yaplakal.com/forum2/topic308421.html
     
    Anaksagor нравится это.
  3. Anaksagor

    Anaksagor Активный пользователь

    С нами с:
    21 ноя 2017
    Сообщения:
    21
    Симпатии:
    0
    Точно пока не знаю, но хотелось бы гибкость какую-то обеспечить и хотя-бы выше перечисленные варианты реализовать.
    Пример комичный :), но можете, пожалуйста, подробнее объяснить? Тогда получается, будут группы типов ачивок, только параметры будет меняться: "доля оценок выше 9 больше 90%", "доля оценок выше 7 больше 70%" и т.д?
     
  4. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Вот примерно та же задача, немного в другой плоскости.
    С пошаговым решением
    Единый запрос...
     
  5. Poznakomlus

    Poznakomlus Активный пользователь

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    пример две таблицы
    1 decoration
    Код (Text):
    1. CREATE TABLE `decorations` (
    2.   `id` int unsigned NOT NULL AUTO_INCREMENT,
    3.   `title` varchar(255) NOT NULL,
    4.   `number_of_times` varchar(255) DEFAULT NULL,
    5.   PRIMARY KEY (`id`)
    6. )
    2 user_decorations
    Код (Text):
    1. CREATE TABLE `user_decorations` (
    2.   `user_id` int unsigned NOT NULL,
    3.   `decoration_id` int unsigned NOT NULL,
    4.   `current_value` int unsigned NOT NULL DEFAULT '0',
    5.   PRIMARY KEY (`user_id`,`decoration_id`),
    6.   KEY `user_decorations_FK_1` (`decoration_id`),
    7.   CONSTRAINT `user_decorations_FK` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
    8.   CONSTRAINT `user_decorations_FK_1` FOREIGN KEY (`decoration_id`) REFERENCES `decorations` (`id`) ON DELETE CASCADE
    9. )
    процент выполнения(%) current_value/number_of_times * 100 | 0
     
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.817
    Симпатии:
    735
    Адрес:
    Татарстан
    универсального решения нет и быть не может, все же комп не человек...
    можно сделать некий конструктор с ограниченным набором характеристик...

    например дать работать с полями: <N> задание(й) [выполнено на] <M> балов, с операторами - [выполнено более чем на],[не менее чем на], [менее чем], [сдано с] <N> раза - [не сдано],[сдано более чем с] итд....

    суть: некий свой язык шаблонов - предложение, которое состоит и полей <N>, и отношений [больше] [равно] [меньше]
    пользователю давать конструировать из них предложения....
     
    Anaksagor и don.bidon нравится это.
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.068
    Симпатии:
    1.231
    Адрес:
    там-сям
    В базе таблица с названиями "достижений" и таблица-связка для назначения достижений пользователям. Отношение многие ко многим.
    В PHP набор правил, который запускает расчет для человека либо по расписанию, либо при срабатывании заранее заданных событий. Например, считаем событием сдачу зачета. Нужно реализовать события и подписку на события.

    Будем реалистами, понадобится и ручной механизм присвоения/отнятия званий. А значит понадобятся права (и роли?) и раздел в админке. Лучше с этого и начать.
     
    Anaksagor нравится это.
  8. IAAWY

    IAAWY Новичок

    С нами с:
    28 июн 2021
    Сообщения:
    17
    Симпатии:
    3
    Можно попробовать демонизировать php
     
  9. Anaksagor

    Anaksagor Активный пользователь

    С нами с:
    21 ноя 2017
    Сообщения:
    21
    Симпатии:
    0
    После долгих размышлений и поисков, нашёл компонент symfony
    PHP:
    1. symfony/expression-language
    , который позволяет некий псевдокод интерпретировать или компирирует его на лету в код php, также в него можно закинуть нужные мне объекты для расчёта ачивок в виде переменных. Компонент позволяет на своём языке дергать реальные методы и свойства реальных объектов и писать выражения для расчётов.
    Остальные библиотеки что я смотрел могут только лишь AST деревья строить либо их нужно допиливать. Своё решение интерпретации на заранее заданных словарях, возможно, было бы более гибким, но отняло бы больше времени и сил на разработку, отладку и тестирование.
    Всем большое спасибо за предложения, вы дали направления куда искать и что смотреть.
     
  10. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    846
    Симпатии:
    131
    успехов в написании ещё одного ии
     
    Walk нравится это.
  11. Walk

    Walk Активный пользователь

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    У вас два пути решения:
    1. Менеджер берет свои руки и мозги, садится и прикидывает на будущее все варианты ачивок, и отдает его вам в письменном виде. Вы по этому листочку анализируете все варианты, выявляете шаблон и реализуете.
    2. Программист пытается написать супер-пупер абстрактный анализатор абстрактного текста - в итоге это займет кучу времени, и в любом случае все варианты покрыты не будут (нет предела фантазиям менеджерам)

    Выбирать вам. Если вас никто не торопит - можно пойти по второму пути, будет интересный опыт. Но с точки зрения практичности, конечно, нужно идти по первому варианту.
     
    neste нравится это.
  12. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Проще менеджеров SQL обучить.
    Тем более, что только SELECT и INSERT понадобятся.
     
  13. Sviridov

    Sviridov Новичок

    С нами с:
    22 сен 2021
    Сообщения:
    24
    Симпатии:
    4
    1) таблица пользователей (user_id, email,password)
    3) таблица достижений (id, name, status)
    2) таблица присвоения достижений (achievement_id, user_id, ... др. поля)

    Собственно таблица юзеров хранит у нас понятно кого. В табле достижений мы записываем сами очивки - "проснулся вовремя" и т.п., Далее - присвоение очивок: чтобы выдать очивку пользователю мы делаем insert запрос и указваем ид очивки (из таблы достижений), ид юзеру кому она присвоена ну и можно всяких колонок для фильтрации накидать (created_at, updated_at, level и пр.). Вот и всё, далее мы можем легко манипулировать этим набором данных как хотим. Хотим выдать очивку за 10 очивок? При выдаче очивки проверяем таблицу присвоения, если count(user_id) = 10 where achevement_id = ? && user_id = ?, то выдаем очивку за достижение. В общем задача не самая сложная :)