We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 9359
    • 128 Posts
    Ciao a tutti,
    ho un grosso problema da risolvere.

    Immaginate di avere una cartella PRODOTTI al cui interno ci sono tante risorse che sono appunto i prodotti.
    Ogni prodotto ha una TV chiamata CATEGORIA ed una TV ciamata SOTTOCATEGORIA. le due tv dovranno leggere il loro contenuto dalle risorse categoria e sottocategoria (tramite @DIRECTORY).
    CATEGORIA-1 CATEGORIA-2
    | |
    SOTTOCATEGORIA-1 SOTTOCATEGORIA-3
    | |
    SOTTOCATEGORIA-2 SOTTOCATEGORIA-4

    Vorrei fare in modo che nel manager prima uno sia costretto a selezionare una categoria e quindi si popola la seconda tv (sottocategoria) con il contenuto delle sottocategorie della categoria selezionata in precedenza.
    Per esempio se uno seleziona la tv categoria CATEGORIA-1, la seconda tv deve mostrare una checklist con SOTTOCATEGORIA-1 e SOTTOCATEGORIA-2 (ma non SOTTOCATEGORIA-3 e SOTTOCATEGORIA-4).

    Spero di essermi spiegato. Che dite si può fare?
    In pratica il contenuto della seconda tv (sottocategorie) dipende da quanto uno ha selezionato nella tv (categorie).

    Grazie a tutti
      "Destiny is not a matter of chance, it's a matter of choice"
      • 22427
      • 793 Posts
      Penso che nello scenario descritto, in qualunque modo la dipendenza della condizione venga realizzata, l’utente manager, doppo la scelta della categoria, sia forzato di salvare il documento prima di essere in grado di scegliere una sottocategoria.

      Mi sembra più facile die avere solamente una TV per tutte le sottocategorie, descrivando anche la categoria a quale appartiene, in questo modo:

      o CATEGORIA-1 / sottocategoria-1
      o CATEGORIA-1 / sottocategoria-2
      o CATEGORIA-2 / sottocategoria-3
      o CATEGORIA-2 / sottocategoria-4
        • 9359
        • 128 Posts
        Grazie mille per la risposta ottogal.
        In effetti la tua soluzione sarebbe più semplice, ma l’esigenza di avere due tv invece di una è che le sottocategorie sono tantissime (centinaia) e volevo fare in modo che scegliendo prima la categoria, l’utente che deve fare data entry non si debba scorrere una lista kilometrica prima di potere scegliere la sottocategoria.
        L’ideale sarebbe implementare il popolamento della tv sottocategoria tramite ajax, ma sinceramente non sò se è possibile... per cui mi appello ai guru di Modx...
          "Destiny is not a matter of chance, it's a matter of choice"
          • 22427
          • 793 Posts
          Forse ho una soluzione per il tuo problema.

          Sei dicendo che le tue categorie ricevono il loro contenuto via @DIRECTORY - cioè assumo che esistono come cartelle nel systema di file, e che le sottocategorie sono le loro sottocartelle. Allora, ci sara un albero di directory come questo:

          categorie
          |
          |_____cat-1
          | |______sottocat-11
          | |______sottocat-12
          |_____cat-2
          |______sottocat-21
          |______sottocat-22

          Hai una prima TV di nome [tt]TVcat[/tt] , per esempio di tipo Radio Options e con
          @DIRECTORY percorso/categorie
          come Input Option Values (con il percorso adatto alla situatione).

          Come risultato nel manager appare l’elenco dei radio buttons così:
          o  cat-1
          o  cat-2

          Adesso ci serve un snippet per racogliere le sottocartelle della categoria scelta via [tt]TVcat[/tt] .
          Lo diamo il nome [tt]getSubcats[/tt] , e questo è il suo code:
          <?php
          $resource = $modx->getObject('modResource',$modx->resource->get('id'));
          $folder = trim($resource->getTVValue('TVcat'), "/.")."/";
          $output = '';
          $files = array();
          if ($handle = opendir(MODX_BASE_PATH.$folder)) {
          while( $file = readdir($handle) ) {
          if (is_dir(MODX_BASE_PATH.$folder.$file) && !in_array($file, array(".","..")))
          $output .= (strlen($output) ? '||' : '').$file.'=='.$folder.$file;
          }
          closedir($handle);
          } else return "Folder {$folder} not found";
          return $output;   
          ?>

          Se per esempio la [tt]TVcat[/tt] ha il valore [tt]cat-2[/tt], lo snippet da come risultato lo string seguente:
          sottocat-21==percorso/cat-2/sottocat-21||sottocat-22==percorso/cat-2/sottocat-22
          Questo è lo string necessario come Input Option Values per la seconda TV di nome [tt]TVsottocat[/tt] (anche di tipo Radio Options) per creare questo elenco di radio buttons:
          o  sottocat-21
          o  sottocat-22

          Per avere l’elenco giusto in dipendenza del valore di [tt]TVcat[/tt] si deve sostituire questo string dal output del nostro snippet, prendendo invece come Input Option Values di [tt]TVsottocat[/tt] il sequente:
          @EVAL return $modx->runSnippet('getSubcats');

          Con questo l’utente editore trova le sottocategorie giuste a scegliere.

          Ma, non è troppo comodo per lui: Quando cambia il valore di [tt]TVcat[/tt] , deve salvare la pagina e rinfrescarla per vedere le sottocategorie cambiate.

          È logico però, perchè il cambio di [tt]TVcat[/tt] dev’essere registrato nel database di MODx per fare effetto. Penso si può vivere con questa restrizione. (Forse ci sono possibilità con Javascript, AJAX ecc. per evitarlo, ma non so abastanza per dare un consiglio.)

          Spero di avere potuto aiutarti.
          Buon successo e tanti saluti!
          ottogal

          Nota 1: Lo snippet [tt]getSubcats[/tt] devo al gentile sostegno della communità tedesca die MODx, specialmente di "sam" ( link )
          Nota 2: L’italiano non è la mia lingua madre - scusate.


          • Alla luce della tua richiesta penso che l'unico modo in modX sia quello di personalizzare la parte relativa a modExt, ovvero alla gestione del pannello di creazione/modifica di una risorsa. Il punto è che per poter gestire in maniera personalizzata tale struttura sei costretto a creare delle CRC e il loro controller per la creazione/update delle risorse. Una volta fatto questo puoi personalizzare modExt in modo che il pannello della 2° TV faccia un refresh a seguito di una selezione della 1° TV. Rimane comunque molto complesso.
              Francesco Mussoni | MODX Ambassador | Skype: solidusite2 | Email: [email protected]