Взаимодействие Flag и Rules

Главные вкладки

Аватар пользователя Alandr Alandr 17 июля 2014 в 16:42

Предположим, что есть тип нод "Школа" (т.е. в нем будут отдельные ноды вроде "Школа №1", "Школа №2" и т.д.). Кроме того, у юзеров в профиле (Profile2) есть поле "Моя школа" (Entity Reference) со ссылкой на одну из этих нод.
Надо сделать так, чтобы юзер мог указать, где он учился, одним из двух способов: 1) выбрав в профиле школу в поле "Моя школа", или 2) кликнув на кнопку/ссылку "Я здесь учился" на странице нужной школы.

Первое решение, которое приходит в голову: Flag + Rules. Вроде бы, все просто: создаем флаг "Я здесь учился", привязываем к нему Rule, которое берет nid у текущей ноды и сохраняет в соответствующем поле профиля (а если флаг отменяется - то очищает поле).
Но при этом возникает проблема с заполнением поля в профиле. Например, юзер сначала кликнул на флаг на странице одной из школ, а затем зашел в профиль и решил изменить школу. При этом надо будет в profile2_save сбросить флаг "старой" школы (как-то так: $flag->flag('unflag', $nid, $user)) и установить флаг "новой" школы. А ведь при каждом изменении флага будет срабатывать соответствующее Rule. Т.е. получится ситуацуия, что поле "Моя школа" будет изменяться три раза подряд, а это выглядит как-то криво.

Вопрос 1: можно ли как-то сбросить/установить флаг так, чтобы привязанное к нему Rule не срабатывало?

Вопрос 2: может, есть какое-то более простое и элегантное решение этой задачи, без шаманства с Flag, Rules и т.п.?

Комментарии

Аватар пользователя whiesam whiesam 17 июля 2014 в 16:55

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

Аватар пользователя Alandr Alandr 17 июля 2014 в 17:30

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

Не совсем понял, что вы хотите сказать.
Пусть юзер зашел на страницу "Школа №2" и кликнул там "Я здесь учился". При этом флаг перейдет во включенное состояние, а в поле "Моя школа" будет занесено "Школа №2". Затем юзер заходит в свой профиль и меняет "Школа №2" на "Школа №5". При этом мы должны сбросить флаг "Школа №2" (чтобы на странице "Школа №2" опять можно было его нажать) и установить флаг "Школа №5" (чтобы на странице "Школа №5" он отображался во включенном состоянии).
Как именно вы предлагаете убрать зависимость от флага?

Аватар пользователя whiesam whiesam 17 июля 2014 в 17:36

"Alandr" wrote:
При этом мы должны сбросить флаг "Школа №2" (чтобы на странице "Школа №2" опять можно было его нажать) и установить флаг "Школа №5" (чтобы на странице "Школа №5" он отображался во включенном состоянии).

Вот тут я не продумал. То что флаг же меняет надпись, при разном состоянии. Как вариант, тайтл флагу дать "Я тут учусь!" во всех состояниях. Но тут тогда будет косяк. Во всех школах будет такой флаг, и человек захотевший понять в какой он школе учиться не через edit профиля, будет в замешательстве.
Суть, наживаем на флаг, меняется школа. То есть менять школу и при снятии флага на этой же школе.

А если всё делать по уму, то свой модуль надо на формах.

Аватар пользователя Alandr Alandr 17 июля 2014 в 17:55

> человек захотевший понять в какой он школе учиться не через edit профиля, будет в замешательстве.
В том-то и дело. Потому мне и надо устанавливать/сбрасывать флаги.

> Суть, наживаем на флаг, меняется школа. То есть менять школу и при снятии флага на этой же школе.
Да, можно, но юзеры будут в недоразумении. Во-первых, при клике на ссылку ожидаешь того, что она изменится, а этого происходить не будет. Во-вторых, как вы правильно заметили, не будет видно, в какой школе учится юзер.

> А если всё делать по уму, то свой модуль надо на формах.
Вы имеете в виду, Forms API? Судя по тому, что я нагуглил, не выглядит сильно проще и понятнее.