Generic Declarative Expression Builder в PHP

Люди,

Я ищу, чтобы создать часть PHP5 UI, который, я уверен, является общим для множества приложений. В принципе, это построитель выражений, который позволяет пользователям указывать выражения, объединенные с помощью логических операторов (AND/OR), например:

  • FieldX > 3 AND FieldY = 5
  • FieldY = "bob" и FieldZ не является нулевым
  • FieldX > '5/23/2007' OR (FieldY = 5 AND FieldY не является нулевым)

В идеале такая система позволила бы мне программисту указать список параметров, которые пользователь может выбрать (столбцы) и тип данных для каждого. Это также обеспечит приятный, удобный интерфейс для определения таких выражений - я представляю что-то вроде таблицы, где каждая строка имеет несколько сборщиков:

[Столбец] [Условие] [Значение] [И/ИЛИ]  [Столбец] [Условие] [Значение] [И/ИЛИ]  ...

Знаете ли вы о компоненте с открытым исходным кодом, который делает что-то подобное? Или, может быть, часть такого рода функций?

Ответ 1

Слово осторожности. Эти типы генераторов выражений обычно считаются отличными решениями для различных проблем пользователей. Мышление имеет тенденцию идти по этим линиям:

  • Пользователь хочет все эти разные отчеты
  • Мы не предоставляем им SQL-доступ (даже если они могли бы это понять)
  • У нас нет времени писать все эти пользовательские отчеты
  • Поэтому я сделаю простой способ для них писать запросы, не зная конкретных синтаксисов, таблиц и полей.

Это не обязательно плохая идея, но то, что мы нашли в моей компании, заключается в том, что пользователи, не являющиеся техническими специалистами, испытывают удивительное затруднение в понимании и создании выражений, более сложных, чем группа ANDS или группа ORS. Это трудно нам понять программистам, поскольку большинство из нас, вероятно, имели интуитивное понимание логической логики еще до того, как мы научились программировать.

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

Помните - иногда трудность для конечных пользователей заключается не в том, что они не знают правильного синтаксиса, чтобы выразить свою идею. Чаще всего это потому, что они даже не знают, как сформулировать свои мысли недвусмысленно, даже если им был предоставлен простой способ сделать это.

ПРИМЕЧАНИЕ. Я не говорю, что конечные пользователи всегда являются придурками - просто их ум может работать по-другому от нас, сумасшедших разработчиков.

Ответ 2

Я думаю, что это очень интересная идея. Планируете ли вы работать над этим проектом для личного использования или работы?

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

В противном случае я вижу, как компания может найти ценность в чем-то подобном. Это дало бы программистам еще одну полезность, которая могла бы помочь им сделать свою работу немного легче и выплатить дивиденды в долгосрочной перспективе.

В любом случае, этот проект побеждает. Вы будете многому научиться и создать то, что другие люди считают полезным.

Ответ 3

Это не совсем компонент, но вы можете взглянуть на вкладку "Условия" в "Редактор правил для корзины покупок" в Magento для надежная реализация PHP этого типа функциональности. Он настроен на электронную коммерцию, поэтому он не является общим наложением базы данных, но имеет отличный интерфейс построителя условий.

Ответ 5

Я думаю, что это больше связано с пользовательским интерфейсом, чем с PHP вообще. Лучше повторите свой вопрос. Возможно, вы просто хотите проанализировать эти определения в PHP, в этом случае я бы предложил использовать preg_replace_callback.

Ответ 6

Я бы начал с создания объектно-ориентированной модели запросов. Например. Критерии-объекты. Следующим шагом будет написать пользовательский интерфейс, который позволяет манипулировать этой модельной структурой.

Ответ 7

Недавно я сделал такую ​​функциональность самостоятельно и, IMHO, проще написать собственную реализацию.

Ответ 8

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

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