Validità temporale limitata di un prodotto

7 contenuti / 0 new
Ultimo contenuto
Validità temporale limitata di un prodotto

Sto smanettando con Rules ma non capisco dove sbaglio. Non è la prima volta che mi capita: anche se uso correttamente gli AND e gli OR, le condizioni mescolate con gli operatori generano errori e non vengono 'beccate', e devo risolvere creando regole distinte per tutte le ipotesi distinte.

Sto impostando una validità temporale limitata per alcuni prodotti del mio negozio (D7+Commerce).
Ho aggiunto quindi due campi al prodotto:
- un booleano (prodotto a validità limitata)
- un campo data, con inizio e fine, per impostare il periodo di validità (tipo per esempio un prodotto attivo solo a Natale)

La prima regola funziona a meraviglia: se la data di inizio è inferiore a quella attuale AND quella di fine maggiore di quella attuale, il prodotto viene impostato come attivo.

La seconda regola no: se la data di inizio è superiore a quella attuale OR quella di fine inferiore a quella attuale, il prodotto dovrebbe essere disattivato. Ma non becca i due casi insieme come 'uno dei due'. Funziona solo se divido in due la seconda regola.

Altro problema: i due eventi a cui posso legare la regola sono la creazione di un prodotto o l'aggiornamento di un prodotto esistente, ma così la regola non va in automatico solo allo scattare della data di disattivazione. Lo fa solo se creo un nuovo prodotto o ne modifico uno esistente, quindi se non si imposta in automatico non mi serve a nulla, perché me lo devo ricordare io.
A quale evento posso legare la regola, per poi avere tutti i campi del Prodotto che mi servono?

Drupal Version:

Giusto per scrupolo, esporto qui la prima regola, funzionante (ma con due eventi che me la rendono inutile).

{ "rules_validit_limitata_prodotti" : {
    "LABEL" : "Validit\u00e0 limitata prodotti - attivazione",
    "PLUGIN" : "reaction rule",
    "REQUIRES" : [ "commerce", "rules", "entity" ],
    "ON" : [ "commerce_product_insert", "commerce_product_update" ],
    "IF" : [
      { "entity_exists" : {
          "type" : "commerce_product",
          "property" : "field_validit_limitata",
          "value" : "1"
        }
      },
      { "entity_has_field" : { "entity" : [ "commerce-product" ], "field" : "field_inizio_validit_" } },
      { "data_is" : {
          "data" : [ "commerce-product:field-inizio-validit-:value" ],
          "op" : "\u003C",
          "value" : [ "site:current-date" ]
        }
      },
      { "AND" : [
          { "data_is" : {
              "data" : [ "commerce-product:field-inizio-validit-:value2" ],
              "op" : "\u003E",
              "value" : [ "site:current-date" ]
            }
          }
        ]
      }
    ],
    "DO" : [
      { "drupal_message" : {
          "message" : "Il prodotto [commerce-product:title] \u00e8 ora attivo.",
          "type" : "warning",
          "repeat" : 0
        }
      },
      { "data_set" : { "data" : [ "commerce-product:status" ], "value" : 1 } }
    ]
  }
}

...enter at your own risk...

Ciao, non ho ben capito perché non ti voglia supportare la seconda regola, ma secondo me c'è un problema con la gestione delle date, pero' per il problema di "quando eseguirla" puoi simulare il runtime legandola alla esecuzione di cron.

E non ho capito se il drupal message è solo per prova o è quello che deve realmente essere richiamato.

M.

--
Michel 'ZioBudda' Morelli -- [email protected]
Sviluppo applicazioni CMS DRUPAL e web dinamiche -- Corsi Drupal -- Amministrazione Drupal -- Hosting Drupal

Il drupal message è vero, non sono sicura di lasciarlo perché in fondo non lo vedo, io utente, ma mi fa comodo che rimanga, ora, ovviamente per le verifiche e in futuro perché saimai, mi rimane nel log.

La seconda non me la becca, niente di niente.
Al cron ci avevo pensato, però non riesco a tirare fuori 'l'entità ha il campo' che mi serve per lavorare sulle date.

...enter at your own risk...

Confermo.
Se uso cron come evento, non c'è modo di tirare fuori l'entità Prodotto e dal Prodotto estrarre i campi data su cui devo lavorare.

...enter at your own risk...

Vediamo, se come evento uso 'Al calcolo del prezzo di vendita di un prodotto' forse risolvo?
Nel peggiore dei casi, se nessuno accede al sito allo scadere del prodotto, alla prima occasione in cui, da una view o dal singolo nodo, si cerca di accedere al prodotto per calcolarne il prezzo, si dovrebbe attivare la regola ed eventualmente disabilitarlo.

O rischio di sbagliare da qualche parte?

...enter at your own risk...

Ciao giuvax,

la soluzione è usare VBO (Views Bulk Operations) e Rules Scheduler, ovvero:

- creare una vista che elenchi la lista di elementi su cui eseguire l'azione (es. lista di prodotti da attiva)
- la vista deve contenere almeno un campo "Bulk Operations" dell'entità da caricare
- ora è possibile creare un Componente Rule, di tipo Action set
- nell'azione selezionare "Load list of objects..." e poi selezionare la vista precedentemente creata
- nel loop della rule eseguire l'azione per ogni elemento della vista
- aggiungere uno schedule al fondo delle azioni ed eseguire.

per più informazioni.
http://nodeone.se/en/using-vbo-to-load-list-of-objects-into-rules