it-swarm.it

Come posso creare collegamenti relativi al menu?

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

Ho i percorsi di menu correnti impostati in questo modo: http://mylocalsite/the_folder_for_the_other_content. Se provo <front>/the_folder_for_the_other_content o /the_folder_for_the_other_content o the_folder_for_the_other_content, Viene visualizzato l'errore "Il percorso" whatever_I_use "non è valido o non è possibile accedervi."

Quando vado dal vivo ho ovviamente bisogno di tutte le voci di menu che puntino a 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?

10
Martin Duys

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 come href="/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 come http:sites/d8/files/Documents/MyFile.pdf, Verrà prodotto un collegamento come 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 contenuti, il browser interpreterà l'URL relativo alla pagina di contenuto e non funzionerà.

Se usi un percorso come http:/sites/d8/files/Documents/MyFile.pdf, Il sistema di menu lo accetterà, ma il sistema di menu produrrà un collegamento come href="http:/sites/d8/files/Documents/MyFile.pdf", Che il browser (almeno Safari) interpreterà come href="http://sites/d8/files/Documents/MyFile.pdf" E non riesco 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'), alla definizione di $ items nel codice di kiamlaluno, funzionerà. Viene anche discussa la questione se menu_tail_load debba richiedere gli argomenti di caricamento esplicito qui: http://drupal.org/node/298561 )

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

4
nachbar

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 dal utente.
drupal_valid_path() restituisce TRUE if

  • Il percorso è <front> (<front>/directory o percorsi simili sono esclusi)
  • Il percorso è un percorso esterno (la funzione rl_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 usi l'URL che punta a un file o a una directory, il server web dovrebbe mostrare quel file o directory, senza invocare 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;
}

Puoi usare qualsiasi valore per titolo e callback della pagina , come quel menu il callback non dovrebbe mai essere chiamato. Il valore di callback di accesso indica Drupal che ogni utente ha accesso a quel callback di 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 utilizzare 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.

5
kiamlaluno

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

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

Nella voce di menu, inserisci come percorso:

http:/frontend

Il menu drupal rimanda a: http://www.example.com/frontend

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

3
Paul

Ho risolto i miei problemi di collegamento con quanto segue:

http://groups.drupal.org/node/210308 e http://drupal.org/node/372252

Si scopre che il mio tema stava stampando il menu in modo errato in modo che tutti gli elementi fossero relativi alla mia posizione corrente (ad esempio admin/logout, anziché/logout).

Spero che sia di aiuto.

1
the_dillio

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.

1
streamfan