Класс Proposition

Класс Proposition (высказывание) служит для сохранения и извлечения логических высказываний, и используется для сохранения отношений между различными объектами сайта. Объекты, между которыми устанавливается отношение, условно называются субъект и объект. "Высказывание" - это предложение, которое либо истинно, либо ложно.

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

В качестве высказывательной формулы ($formula) используются любой текст, желательно на латинице и без пробелов. В качестве субъектов и объектов используются не наименования, а их идентификаторы в виде натуральных чисел ($subjectId, $objectId). Вопрос перевода наименований субъектов и объектов в их идентификаторы должен решать сам разработчик сайта.

Сохранение высказываний

Истинность или ложность высказывания фиксируется с помощью метода Proposition::set().

Proposition::set($formula, $subjectId, $objectId, true);
Если в последнем (четвертом) параметре пишется 1, то высказывание фиксируется как истинное. Если пишется 0, то высказывание примет значение "ложь" (на самом деле высказывание просто удаляется).

Допустим, человек по имени Петя имеет идентификатор 12, а фрукт в виде банана имеет идентификатор 5. Создадим и сохраним высказывание "Петя любит банан":

Proposition::set('Человек любит фрукт', 12, 5, true);

Высказывания только с субъектом или только с объектом

Можно создавать высказывания, которые не устанавливают отношения между субъектом и объектом, а устанавливают какое-то свойство субъекта или объекта. То есть, не используется один из параметров: субъект или объект. В этом случае нужно вместо неиспользуемого параметра поставить значение null. Например, высказывание "Петя любит поесть", можно записать так:

Proposition::set('Человек любит поесть', 12, null, true);

Высказывания без субъекта и без объекта

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

Proposition::set('Люди любят поесть', null, null, true);
Здесь нет никаких отношений, и по сути происходит просто сохранение булевой переменной, а для этих целей проще пользоваться классом Store.

Извлечение высказываний

Высказывания (истинные высказывания) извлекаются с помощью метода Proposition::get() со следующими параметрами:

$props = Proposition::get($formula, $subjectId, $objectId);

Пример:

if (Proposition::get('Человек любит фрукт', 12, 5))
    echo 'Петя любит банан';

В этом примере только проверялось существование определенного высказывания. На самом деле метод Proposition::get() возвращает массив, где один из элементов выглядит, например, так:
0 => ['subject-id' => 12, 'object-id' => 4]

При извлечении высказываний вместо идентификаторов субъекта или объекта можно подставлять значение "all" или "any".

Если в предыдущем высказывании вместо определенного фрукта, указать "all" то можно узнать все фрукты, которые любит Петя:

$props = Proposition::get(('Человек любит фрукт', 12, 'all'));
/*
Будет выведен например, такой массив:
0 => ['subject-id' => 12, 'object-id' => 4]
1 => ['subject-id' => 12, 'object-id' => 5]
2 => ['subject-id' => 12, 'object-id' => 6]
*/

Аналогично можно узнать всех людей которые любят бананы:

$props = Proposition::get('Человек любит фрукт', 'all', 5);

Можно узнать, имеется ли хотя бы один человек, который любит есть бананы:

if (Proposition::get('Человек любит фрукт', 'any', 5))
    echo 'есть человек, который любит банан';
Вместо значения "any" можно конечно применять и значение "all", но с "any" метод сработает быстрее.

А вот так можно получить список всех людей которые любят хотя бы один фрукт:

$props = Proposition::get('Человек любит фрукт', 'all', 'any');

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

$props = Proposition::get('Люди любят поесть', null, null);
$props = Proposition::get('Люди любят поесть');

Удаление высказываний

В параграфе "Сохранение высказываний" было показано, что удалить высказывание, можно присвоив высказыванию значения "ложь":

Proposition::set('Человек любит фрукт', 12, 5, false);

То же самое можно сделать с помощью метода Proposition::delete(). Однако, возможности этого метода шире, с его помощью можно удалить те только одно высказывание, но и высказывания, удовлетворяющие определенному признаку.

Например, указав в качестве идентификатора фрукта "all", можно удалить все высказывания о фруктах, которые любит Петя:

Proposition::delete('Человек любит фрукт', 12, 'all');

Зарезервированные высказывательные формулы

Система управления сама использует класс Proposition. По этой причине нельзя использовать следующие высказывательные формулы.

Высказывательные формулы с субъектом и объектом

  • user-is-editor-of-block
  • user-is-editor-of-records
  • user-is-subscriber
  • user-sees-hidden-page

Высказывательные формулы только с субъектом

  • page-is-hidden
  • user-dont-see-edit-buttons
  • user-is-activated
  • user-is-admin
  • user-as-visitor
  • user-is-editor
  • user-sees-block-boundaries

Высказывательные формулы без субъекта и без объекта

  • site-is-down

Советы

  • Класс Proposition служит для сохранения различных установок, прав доступа и т.п. Применяйте этот класс когда нужно сохранить редкие перекрестные связи объетов, и нет смысла создавать таблицы соответствия.
  • Не следует создавать высказывательные формулы, которые для большинства высказываний окажутся истинными по умолчанию. Например, вместо формулы "Человек ночью спит", лучше применять формулу "Человек ночью не спит". Вторая формула потребует гораздо меньше ресурсов.