Вы здесь

Как ограничить доступ к проданной ноде по времени?

0

На Drupal Commerce реализовали функционал продажи отдельных нод.
Конкретный пользователь покупая товар получает доступ к ноде, которая прикреплена к этому товару.
Реализовать такой функционал нам помогло видео: https://commerceguys.com/blog/selling-node-access-drupal-commerce

Сейчас хотим добавить к данному функционалу ограничение по времени. Чтобы (например) после 30 дней с момента покупки ноды вновь лишать пользователя доступа к ноде.

Есть модуль Commerce Licence. Он позволяет продавать на ограниченное время роль для пользователя. По истечению проплаченного периода роль у пользователя пропадает.

Но это не совсем то что нам нужно.

Какие есть идеи и может готовые решения для этого? Подскажите, пожалуйста.

Версия Drupal: 
7.x
Категория: 
Access control
Вопрос задан 11.03.2017 - 08:59

Ответы

1

дальше рулсами пробовали?
http://drupal-tv.ru/video/otlozhennoe-vypolnenie-deystviy-rules-s-pomosh...
http://xandeadx.ru/blog/drupal/649
вот примеры как создать и выполнить действие спустя время.

Ответ дан 12.03.2017 - 23:46

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

Код рула выглядит так:

{ "rules_take_away_user_access_to_course" : {
    "LABEL" : "Take away user access to course",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules", "entity" ],
    "ON" : { "commerce_order_update" : [] },
    "IF" : [
      { "data_is" : { "data" : [ "commerce-order:state" ], "value" : "completed" } }
    ],
    "DO" : [
      { "LOOP" : {
          "USING" : { "list" : [ "commerce-order:commerce-line-items" ] },
          "ITEM" : { "list_item" : "Line item" },
          "DO" : [
            { "component_rules_disable_premium_access" : { "line_item" : [ "list-item" ] } }
          ]
        }
      }
    ]
  }
}

Далее запускается действие component_rules_disable_premium_access

{ "rules_disable_premium_access" : {
    "LABEL" : "Disable premium access",
    "PLUGIN" : "rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules", "rules_scheduler", "smsru" ],
    "USES VARIABLES" : { "line_item" : { "label" : "Line item", "type" : "commerce_line_item" } },
    "IF" : [
      { "entity_has_field" : { "entity" : [ "line-item" ], "field" : "commerce_product" } },
      { "entity_has_field" : {
          "entity" : [ "line-item:commerce-product" ],
          "field" : "field_premium_node"
        }
      },
      { "entity_has_field" : {
          "entity" : [ "line-item:commerce-product" ],
          "field" : "field_access_duration"
        }
      }
    ],
    "DO" : [
      { "variable_add" : {
          "USING" : { "type" : "duration", "value" : 60 },
          "PROVIDE" : { "variable_added" : { "duration_1_day" : "Duration (1 day)" } }
        }
      },
      { "data_calc" : {
          "USING" : {
            "input_1" : [ "duration-1-day" ],
            "op" : "*",
            "input_2" : [ "line-item:commerce-product:field-access-duration" ]
          },
          "PROVIDE" : { "result" : { "calculate_duration" : "Calculate duration" } }
        }
      },
      { "data_calc" : {
          "USING" : {
            "input_1" : [ "line-item:order:created" ],
            "op" : "+",
            "input_2" : [ "calculate-duration" ]
          },
          "PROVIDE" : { "result" : { "disable_access_date" : "Disable access date" } }
        }
      },
      { "schedule" : {
          "component" : "rules_revoke_access_by_user",
          "date" : [ "disable-access-date" ],
          "identifier" : [ "line-item:commerce-product:field-premium-node:nid" ],
          "param_line_item" : [ "line-item" ]
        }
      },
      { "smsru_send_sms" : {
          "telephone" : [ "line-item:order:owner:sms-auth-phone" ],
          "sms_text" : [ "line-item:commerce-product:field-premium-node:nid" ]
        }
      }
    ]
  }
}

До сих пор всё работает как часы. Но вот последнее действие rules_revoke_access_by_user никак не хочет выполняться. То есть всё калькулируется и в Rules Schedule появляется задание на выполнение этого самого действия: rules_revoke_access_by_user

В нём такое поведение:

{ "rules_revoke_access_by_user" : {
    "LABEL" : "Revoke access by user",
    "PLUGIN" : "rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules", "content_access_rules", "smsru" ],
    "USES VARIABLES" : { "line_item" : { "label" : "Line item", "type" : "commerce_line_item" } },
    "IF" : [
      { "entity_has_field" : { "entity" : [ "line-item" ], "field" : "commerce_product" } },
      { "entity_has_field" : {
          "entity" : [ "line-item:commerce-product" ],
          "field" : "field_premium_node"
        }
      }
    ],
    "DO" : [
      { "content_access_action_user_revoke" : {
          "node" : [ "line-item:commerce-product:field-premium-node" ],
          "content_access_user_view" : [ "line-item:order:owner" ],
          "content_access_user_update" : [ "" ],
          "content_access_user_delete" : [ "" ]
        }
      },
      { "smsru_send_sms" : {
          "telephone" : [ "line-item:order:owner:sms-auth-phone" ],
          "sms_text" : [ "line-item:commerce-product:field-premium-node:title" ]
        }
      }
    ]
  }
}

В этом действии мы убираем право на доступ к ноде. Вроде всё логически верно, но на практике не работает.

Подскажите, что может быть не так? Или если по данному тексту сложно что-либо установить, то подскажите способы отладки работы рулсов. Как можно протестировать их работу? Найти ошибки в построении логики? А то всё в слепую же получается.
Есть подозрение, что на последнем этапе рул просто не может увязать конкретную ноду, к которой нужно применить это всё.

Комментарий оставлен 13.03.2017 - 09:06

у компонентов есть кнопка выполнить, там вы можете указать ид пользователя и ид ноды для которых нужно выполнить компонент, так можно проверить срабатывает ли ваш набор правил для снятия доступа.
http://clip2net.com/s/3InMahk
http://clip2net.com/s/3InMfJS

Комментарий оставлен 13.03.2017 - 09:36

Всё получилось. Оказалось не верные параметры забивал в последний рулс. Спасибо вам за отзывчивость.

Комментарий оставлен 14.03.2017 - 04:55