Modifica dell'URL del filtro esposto


15

Quando ho usato un filtro esposto, la selezione del filtro viene passata come coppia nome / valore nell'URL, ad esempio:

members?field_a=valuea&field_b=valueb

Come posso impostarlo per usare più di un url di stile "pathauto":

members/valuea/valueb

Ottima domanda AFAIK, non è possibile al momento, tranne che con il codice. Trovato questo che sembra risolvere il problema, ma non ancora testato.
Countzero,

Hai problemi con l'URL pulito, leggi questo post drupal.org/getting-started/clean-urls
subhojit777,

1
Ho l'url pulito abilitato, per altre pagine è in notazione seo friendly, ma per il filtro esposto è solo una stringa di query, ad esempio quando vado a qualsiasi articolo, url è seo friendly. Per favore fatemi sapere se mi manca qualcosa.
Kalpesh Patel,

Vedo che potrebbe esserci qualche punto su questo, ma prima di andare al guaio in realtà cerco prove. Ciò che conta di più: un "URL SEO-friendly" o contenuti che corrispondono a ricerche comuni? Se una pagina dei risultati ha un titolo forte, sospetto che sarà molto più preziosa del suo URL. Mi concentrerei sicuramente prima sul contenuto, in ogni caso.
Alfred Armstrong,

Risposte:


9

Un mio collega ha creato un modulo chiamato path data qualche tempo fa. La sua intenzione era di risolvere proprio questo problema. Purtroppo si è scoperto che è in conflitto con gli alias percorso regolare, in modo da funzionare su un sito come drupal.org che non utilizza gli alias, ma sarà interrompere i collegamenti su un percorso-alias che utilizzano sito.

Attualmente, ritengo che l'unico modo generico per risolvere questo problema sia manipolando gli URL a livello httpd, sia utilizzando hook_url_inbound_alter e hook_url_outbound_alter . Puoi leggere un po 'di più sugli hook menzionati in questa domanda .

Tuttavia, se dovessi dare a me stesso un'altra ripresa, proverei invece una soluzione specifica di Views, poiché questo problema è abbastanza comune da giustificare un modulo per questo.

In hook_views_pre_build , si potrebbero prendere dati da un url come "members / valuea / valueb", inserire questi valori in $ _GET ['q'], lasciare che le viste costruiscano la loro query vedendo gli argomenti get "nell'url", quindi eventualmente rimuoverli di nuovo in hook_views_post_build .


Grazie. Non sembra banale. Lo voglio principalmente per scopi SEO perché gli spider dei motori di ricerca non passano da un modulo all'altro. Potrei semplicemente usare una seconda vista con filtri contestuali e incorporare il mio blocco filtro esposto. Quindi ho solo bisogno di un po 'di javascript per fare in modo che il filtro esposto venga inviato alla mia vista originale.
Uwe

hmm, se lo facessi potrei usare javascript per modificare il modulo OTTIENI l'URL dalla pagina? nome1 = valore1 e nome2 = valore2 in pagina / valore1 / valore2 stackoverflow.com/questions/5815995/… . Se javascript è disabilitato, ho la mia vista originale come fallback.
Uwe

@letharion: non vedo alcun supporto per Drupal 7.
React Developer il

4

C'è un modulo, Query Parameters To URL , che ho recentemente rilasciato che risolve il problema che stai descrivendo:

Questo modulo offre la possibilità di riscrivere i parametri della query URL nei componenti Clean URL su percorsi specificati.

È possibile configurare quali percorsi devono riscrivere i propri argomenti di query come componenti URL puliti utilizzando una semplice espressione regolare o implementando un hook del modulo.

In questo modo puoi trasformare un URL del filtro esposto di Views come

http://example-site.com/events?field_category_id[0[=100&field_category_id 1 = 101 & field_author_name [0] = John & field_author_surname [0] = Doe

in http://example-site.com/events/p/field_category_id/0__100--1__101/field_author_name/0__John/field_author_surname/0__Doe

Sotto usa hook_url_inbound_alter, hook_url_outbound_alter e hook_init con reindirizzamenti ove necessario.


Che dire di Drupal 8?
InspiredCoder

1

I filtri esposti sono moduli, il che significa che il luogo in cui vengono reindirizzati (attributo "azione") deve essere noto prima che l'utente scelga qualsiasi opzione. Quindi non possiamo reindirizzarlo a nessun URL carino che contenga informazioni sulla sua scelta. Le soluzioni alternative:

  1. JavaScript. Utilizzare JavaScript per modificare al volo l'attributo "azione" del modulo filtro esposto in base alle opzioni scelte dall'utente e impostare "azione" sull'URL della vista corretta con i filtri contestuali adeguati configurati. Ma dubito che sarebbe "SEO friendly" allora (per favore qualcuno mi corregga se sbaglio).

  2. Fai doppio reindirizzamento. Utilizzando hook_form_alter, dopo aver ottenuto il modulo, reindirizzare l'utente all'URL della vista corretta, con i filtri contestuali adeguati configurati, in base al suo input. Questo potrebbe effettivamente richiedere una conferma dell'utente su alcuni browser, quindi potrebbe essere estremamente fastidioso.

In entrambi i metodi sopra, è necessario utilizzare https://drupal.org/project/views_expost per modificare il metodo di tali moduli in POST, in modo che le variabili non inquinino l'URL degli utenti.

La linea di fondo è che se hai bisogno di avere abbastanza URL con filtri esposti, probabilmente stai facendo qualcosa di sbagliato. Perché penso che siano solo per filtrare i dati e non dovrebbero essere usati per definire nuove pagine sul sito web. Se ne hai bisogno, puoi creare una vista configurata per essere un menu e url in quel menu, reindirizzerebbe l'utente alla stessa vista che è ora, ma con diversi filtri contestuali.


1

Dal punto di vista programmatico, è sempre possibile utilizzare hook di hook_url_inbound_alter () e hook_url_outbound_alter () .

Puoi provare a interrogare i parametri nel modulo URL o se stai utilizzando l' API di ricerca e le facce , puoi utilizzare i percorsi graziosi dell'API delle facce .

È inoltre possibile convertire la vista per utilizzare gli argomenti nel percorso e utilizzare il modulo Redirect .

A parte quanto sopra, non esiste un modo semplice per raggiungere questo obiettivo, poiché esiste ancora una funzione in sospeso per Drupal 8; vedere Consenti stringhe di query negli alias URL .

Quando usi pannelli che usano viste e, ad esempio, filtri meglio esposti, puoi fare alcuni hack come (esempio URL: / panel_url? Categoria = 123):

/**
 * Implements hook_url_inbound_alter().
 */
function foo_url_outbound_alter(&$path, &$options, $original_path) {
  if (arg(0) == 'panel_url') {
    // Convert URL like: /panel_url?category=29 into /panel_url/term_name (SEO friendly)
    $path_info = parse_url($path);
    switch (@$path_info['path']) {
      case 'panel_url/term_name':
      case 'panel_url/term_name2':
        $path = 'panel_url/all'; // Convert loopy urls into base url
    }
    if (strpos($path, '?category=') !== FALSE) { // Convert term id into human name
      list(, $tid) = explode('=', current(explode('&', $path_info['query']))); // get tid from URL
      $term_name = strtolower(taxonomy_term_load((int)$tid)->name);
      $path = '/panel_url' . '/' . $term_name; // See also: $path_info['path']
    }
  }
}

Per ulteriori informazioni, consultare Passare l'argomento dall'URL nel pannello per visualizzare il riquadro o il blocco .

Infine, è possibile utilizzare hook_menu () per definire i callback dei menu personalizzati e caricare la vista a livello di codice .


-1

È possibile utilizzare il seguente codice.

function hook_form_alter(&$form, &$form_state, $form_id) {   
  if ($form_id == "abcd") {
    $form['#submit'] = array('custom_search_redirect');
  }
}


function custom_search_redirect($form, &$form_state) {  
  $form_state['redirect'] = "members/valuea/valueb;
}

Views non è a conoscenza del nuovo URL con la tua soluzione !!
prabeen giri,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.