it-swarm-eu.dev

Jak vytvořím relativní odkazy v nabídce?

Jsem zaneprázdněn prací na webu mého localhost, který potřebuje odkaz na nějaký obsah, který je oddělený od Drupalu.

Mám nastavené aktuální cesty nabídky: http://mylocalsite/the_folder_for_the_other_content. Pokud se pokusím <front>/the_folder_for_the_other_content nebo /the_folder_for_the_other_content nebo the_folder_for_the_other_content, Zobrazí se chybová zpráva „Cesta 'what_I_use' je buď neplatná, nebo k ní nemáte přístup.“

Když začnu žít, očividně potřebuji všechny položky nabídky, aby ukazovaly na http://myrealsite/the_folder_for_the_other_content.

Jak to mohu nastavit tak, abych nemusel upravovat všechny cesty menu, když budu naživo?

10
Martin Duys

kiamlalunoova odpověď pro mě nefungovala úplně. Použití% menu_tail způsobilo bouři chyb, že funkce menu_tail_load měla problémy s chybějícími argumenty:

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).

Co pro mě fungovalo, bylo

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;
}

Pak jsem mohl obsloužit soubory ve složce sites/d8/files (a podsložky) pomocí položek nabídky s cestami jako sites/d8/files/Documents/MyFile.pdf

Systém nabídek poté vygeneruje odkaz jako href="/sites/d8/files/Documents/MyFile.pdf"

Pokud nepoužíváte modul uživatelských nabídek, systém nabídek odmítne cestu začínající výše uvedeným způsobem.

Pokud se pokusíte použít cestu jako http:sites/d8/files/Documents/MyFile.pdf, Vytvoří odkaz jako href="http:sites/d8/files/Documents/MyFile.pdf", Který bude fungovat, když jste v kořenovém adresáři webu, ale když jste na obsahové stránce, prohlížeč bude interpretovat adresu URL vzhledem k obsahové stránce a nebude fungovat.

Pokud použijete cestu jako http:/sites/d8/files/Documents/MyFile.pdf, Systém nabídky ji přijme, ale systém nabídek vytvoří odkaz jako href="http:/sites/d8/files/Documents/MyFile.pdf", Který prohlížeč (alespoň Safari) bude interpretovat jako href="http://sites/d8/files/Documents/MyFile.pdf" A nepodařilo se najít server s názvem „sites“.

(Při dalším vyšetřování selže kód používající menu_tail to, že musíte přidat „argumenty zatížení“, jak je uvedeno zde: http://api.drupal.org/api/drupal/includes--menu .inc/function/menu_tail_load/7 . Pokud k definici $ položek v kódu kiamlaluno přidáte 'load arguments' => array('%map', '%index'),, bude to fungovat. Probírá se také otázka, zda by menu_tail_load měla vyžadovat argumenty explicitního načtení. zde: http://drupal.org/node/298561 )

(Nezapomeňte povolit nový modul, jinak systém nabídek nové odkazy nepřijme.)

4
nachbar

Když přidáte nový odkaz, bude odkaz ověřen z menu_edit_item_validate () , který volá drupal_valid_path () , aby zkontroloval, zda je cesta platná, nebo je přístupná z uživatel.
drupal_valid_path() vrátí TRUE if

  • Cesta je <front> (<front>/directory nebo podobné cesty jsou vyloučeny)
  • Cesta je externí cesta (funkce rl_is_external () vrátí TRUE)
  • Cesta je spojena s zpětným voláním nabídky

Kromě použití absolutních adres URL je jediným řešením vlastní modul, který definuje zpětné volání nabídky spojené s cestou, kterou chcete použít.
Při použití adresy URL, která odkazuje na soubor nebo adresář, by webový server měl tento soubor nebo adresář zobrazit, aniž by vyvolával Drupal. To se děje s Apache, protože soubor .htaccess, který je dodáván s Drupal obsahuje následující směrnice:

# 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]

Ve vašem případě by měl vlastní modul obsahovat kód podobný následujícímu:

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;
}

Jako nabídku můžete použít libovolné hodnoty pro název a zpětné volání stránky . zpětné volání by nemělo být nikdy vyvoláno. Hodnota zpětného volání přístupu říká Drupal), že každý uživatel má přístup k tomuto zpětnému volání nabídky.

Jako alternativu můžete definovat zpětné volání nabídky spojené s „alias_for_directory /% menu_tail“, které uživatele přesměruje do adresáře, který chtějí vidět (pomocí drupal_goto () )). Toto řešení bych použil, když server nevyužije obsah .htaccess, a vyvolalo by to Drupal, i když adresa URL ukazuje na existující soubor nebo adresář).

5
kiamlaluno

Pro mě to udělal trik (on drupal 6)).

Chci přesměrovat na jinou adresu URL ve stejné doméně, řekněme Drupal běží na http://www.example.com a já chci mít odkaz na http://www.example.com/frontend

V položce nabídky zadejte jako cestu:

http:/frontend

Nabídka drupal bude odkazovat na: http://www.example.com/frontend

Když používáte https, měli byste do pole cesty pro položku nabídky zadat https:/frontend.

3
Paul

Problémy s odkazy jsem vyřešil následujícím způsobem:

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

Ukázalo se, že můj motiv tiskl menu nesprávně, takže všechny položky byly relativní k mému aktuálnímu umístění (tj. Admin/logout, místo/logout).

Snad to pomůže.

1
the_dillio

Použil jsem sql k nahrazení odkazu ve struktuře menu:

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

Nejsem si jistý, jestli to musím udělat, ale pak jsem propláchl cache menu.

1
streamfan