Come posso creare collegamenti relativi al menu?


10

Sono impegnato a lavorare su un sito sul mio localhost che deve collegarsi ad alcuni contenuti separati da Drupal.

Ho i percorsi di menu attuali stabiliti in questo modo: http://mylocalsite/the_folder_for_the_other_content. Se provo <front>/the_folder_for_the_other_contento /the_folder_for_the_other_contento the_folder_for_the_other_content, visualizzo l'errore "Il percorso 'whatever_I_use' non è valido o non hai accesso ad esso."

Quando vado dal vivo ho ovviamente bisogno di tutte le voci di menu a cui puntare http://myrealsite/the_folder_for_the_other_content.

Come posso impostarlo in modo da non dover modificare tutti i percorsi dei menu quando vado in diretta?


@irishbuzz ha una soluzione alternativa per Drupal 6 di seguito, ma speravo di poter evitare di farlo in Drupal 7. È un pio desiderio da parte mia?
Martin Duys,

Drupal è installato nella directory principale del web server?
kiamlaluno

Non sulla mia versione localhost, ma quando finalmente diventerà attiva sarà nella cartella principale della cartella public_html. Conta come "root del web server"?
Martin Duys,

Per "directory principale del web server" intendo la directory che in Apache è impostata con la direttiva "DocumentRoot" e che, per impostazione predefinita, è la directory public_html. È la directory di accesso di Apache quando si utilizza un URL simile http://example.com/.
kiamlaluno

Quindi: sì, alla fine il sito sarà nella directory principale
Martin Duys,

Risposte:


4

la risposta di kiamlaluno non ha funzionato del tutto per me. L'uso di% menu_tail ha prodotto una tempesta di errori che la funzione menu_tail_load stava avendo problemi con argomenti mancanti:

Warning: Missing argument 2 for menu_tail_load(), called in  ... /includes/menu.inc on line 579 and defined in menu_tail_load() (line 827 of ... /includes/menu.inc).
Warning: Missing argument 3 for menu_tail_load(), called in ... /includes/menu.inc on line 579 and defined in menu_tail_load() (line 827 of ... /includes/menu.inc).

Ciò che ha funzionato per me è stato

function allow_menu_links_menu() {
  $items = array();
  $items['sites/d8/files/%'] = array(
    'title' => 'Folder Content',
    'page callback' => 'allow_menu_links_cb', /* never called */
    'access callback' => TRUE,
  );
  return $items;
}

Quindi, potrei servire i file nella cartella siti / d8 / files (e sottocartelle) usando voci di menu con percorsi come sites/d8/files/Documents/MyFile.pdf

Il sistema di menu genererà quindi un collegamento simile href="https://drupal.stackexchange.com/sites/d8/files/Documents/MyFile.pdf"

Se non si utilizza il modulo di menu personalizzato, il sistema di menu rifiuterà un percorso che inizia come sopra.

Se si tenta di utilizzare un percorso simile http:sites/d8/files/Documents/MyFile.pdf, verrà prodotto un collegamento simile href="http:sites/d8/files/Documents/MyFile.pdf", che funzionerà quando ci si trova nella radice del sito, ma quando ci si trova in una pagina di contenuto, il browser interpreterà l'URL relativo alla pagina di contenuto, e non funzionerà.

Se si utilizza un percorso simile http:/sites/d8/files/Documents/MyFile.pdf, il sistema di menu lo accetterà, ma il sistema di menu produrrà un collegamento simile href="http:/sites/d8/files/Documents/MyFile.pdf", che il browser (almeno Safari) interpreterà href="http://sites/d8/files/Documents/MyFile.pdf"e non riuscirà a trovare il server denominato "siti".

(Per ulteriori indagini, il motivo per cui il codice che utilizza menu_tail non riesce è che è necessario aggiungere gli 'argomenti di caricamento', come indicato qui: http://api.drupal.org/api/drupal/includes--menu.inc/function / menu_tail_load / 7. Se aggiungi 'load arguments' => array('%map', '%index'),la definizione di $ items nel codice di kiamlaluno, funzionerà. La questione se menu_tail_load debba richiedere gli argomenti di caricamento esplicito è anche discussa qui: http://drupal.org/node/298561 )

(Non dimenticare di abilitare il tuo nuovo modulo, altrimenti il ​​sistema di menu non accetterà i nuovi collegamenti)


5

Quando si aggiunge un nuovo collegamento, il collegamento viene convalidato da menu_edit_item_validate () , che chiama drupal_valid_path () per verificare se il percorso è valido o è possibile accedervi dall'utente.
drupal_valid_path()restituisce TRUEif

  • Il percorso è <front>( <front>/directoryo sono esclusi percorsi simili)
  • Il percorso è un percorso esterno (la funzione url_is_external () restituisce TRUE)
  • Il percorso è associato a una richiamata del menu

Oltre all'utilizzo di URL assoluti, l'unica soluzione è disporre di un modulo personalizzato che definisca un callback di menu associato al percorso che si desidera utilizzare.
Quando si utilizza l'URL che punta a un file o a una directory, il server Web dovrebbe mostrare quel file o directory, senza richiamare Drupal. Questo è ciò che accade con Apache, poiché il file .htaccess fornito con Drupal contiene le seguenti direttive:

# Pass all requests not referring directly to files in the filesystem to
# index.php. Clean URLs are handled in drupal_environment_initialize().
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ index.php [L]

Nel tuo caso, il modulo personalizzato dovrebbe contenere un codice simile al seguente:

function mymodule_menu() {
  $items = array();

  $items['the_folder_for_the_other_content/%menu_tail'] = array(
    'title' => 'Folder content', 
    'page callback' => 'mymodule_view', 
    'access callback' => TRUE,
    'load arguments' => array('%map', '%index'), 
  );

  return $items;
}

È possibile utilizzare qualsiasi valore per il callback del titolo e della pagina , poiché tale callback del menu non deve mai essere chiamato. Il valore del callback di accesso dice a Drupal che ogni utente ha accesso al callback di quel menu.

In alternativa è possibile definire un callback di menu associato a "alias_for_directory /% menu_tail" che reindirizza l'utente alla directory che si desidera vedere (utilizzando drupal_goto () ). Vorrei usare questa soluzione quando il server non utilizza il contenuto di .htaccess e invocherebbe Drupal anche quando l'URL punta a un file o una directory esistente.


3

Per me il seguente ha fatto il trucco (su drupal 6).

Voglio indirizzare a un altro URL sullo stesso dominio, diciamo che Drupal è in esecuzione http://www.example.come voglio avere un link ahttp://www.example.com/frontend

Nella voce di menu, inserisci come percorso:

http:/frontend

Il menu drupal si collegherà a: http://www.example.com/frontend

Quando si utilizza https, è necessario immettere https: / frontend nel campo percorso per la voce di menu.


Qualche idea se questo funzionerebbe in 7 /
Martin Duys il

Non lo so, provalo.
Paul,

Trovo che questo metodo non funzioni dalla versione 7.22.
Rick,

1
Funziona con Drupal 7.23. Sto provando a farlo da un po ', se potessi ti
voterei


1

Ho usato sql per sostituire il collegamento nella struttura del menu:

UPDATE menu_links SET link_path = replace(link_path, "livesite.com", "localhost.com");

Non sono sicuro se avessi bisogno di farlo, ma ho quindi svuotato le cache dei menu.


perché vorresti cambiare la query però? Non è raccomandato
Gerl,
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.