Como crio links de menu relativos?

10

Estou ocupado trabalhando em um site no meu host local que precisa vincular a algum conteúdo separado do Drupal.

Eu tenho os caminhos de menu atuais configurado como este: http://mylocalsite/the_folder_for_the_other_content. Se eu tentar <front>/the_folder_for_the_other_contentou /the_folder_for_the_other_contentou the_folder_for_the_other_content, recebo o erro "O caminho 'qualquer_I_utilização' é inválido ou você não tem acesso a ele."

Quando vou ao ar, obviamente preciso de todos os itens de menu para apontar http://myrealsite/the_folder_for_the_other_content.

Como posso configurá-lo para não precisar editar todos os caminhos do menu quando for ao ar?

Martin Duys
fonte
@irishbuzz tem uma solução alternativa para o Drupal 6 abaixo, mas eu esperava poder evitar isso no Drupal 7. Esse pensamento positivo da minha parte?
Martin Duys
O Drupal está instalado no diretório raiz do servidor web?
kiamlaluno
Não na minha versão localhost, mas quando finalmente for lançada, ela estará na raiz da pasta public_html. Isso conta como 'raiz do servidor web'?
22611 Martin Duys
Por "diretório raiz do servidor web", quero dizer o diretório que no Apache está definido com a diretiva "DocumentRoot" e que, por padrão, é o diretório public_html. É o diretório que o Apache acessa quando você usa uma URL como http://example.com/.
Kiamlaluno
Então: sim, finalmente, o site estará no diretório raiz
Martin Duys

Respostas:

4

a resposta de kiamlaluno não funcionou muito bem para mim. O uso de% menu_tail produziu uma tempestade de erros que a função menu_tail_load estava tendo problemas com argumentos ausentes:

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

O que funcionou para mim foi

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

Então, eu poderia servir arquivos na pasta sites / d8 / files (e subpastas) usando itens de menu com caminhos como sites/d8/files/Documents/MyFile.pdf

O sistema de menus gerará um link como href="/drupal//sites/d8/files/Documents/MyFile.pdf"

Se você não usar o módulo de menu personalizado, o sistema de menus rejeitará um caminho que começa como acima.

Se você tentar usar um caminho como http:sites/d8/files/Documents/MyFile.pdf, ele produzirá um link como href="http:sites/d8/files/Documents/MyFile.pdf", que funcionará quando você estiver na raiz do site, mas quando estiver em uma página de conteúdo, o navegador interpretará o URL relativo à página de conteúdo, e não vai funcionar.

Se você usar um caminho como http:/sites/d8/files/Documents/MyFile.pdf, o sistema de menus o aceitará, mas o sistema de menus produzirá um link como o href="http:/sites/d8/files/Documents/MyFile.pdf"qual o navegador (pelo menos o Safari) interpretará como href="http://sites/d8/files/Documents/MyFile.pdf", e falhará ao tentar encontrar o servidor chamado "sites".

(Em uma investigação mais aprofundada, o motivo pelo qual o código usando menu_tail falha é que você precisa adicionar os 'argumentos de carregamento', conforme observado aqui: http://api.drupal.org/api/drupal/includes--menu.inc/function / menu_tail_load / 7. Se você adicionar 'load arguments' => array('%map', '%index'),à definição de $ items no código de kiamlaluno, ele funcionará. A questão de se menu_tail_load deve exigir argumentos explícitos de carga também é discutida aqui: http://drupal.org/node/298561 )

(Não esqueça de ativar seu novo módulo, ou o sistema de menus não aceitará os novos links)

nachbar
fonte
5

Quando você adiciona um novo link, o link é validado em menu_edit_item_validate () , que chama drupal_valid_path () para verificar se o caminho é válido ou pode ser acessado pelo usuário.
drupal_valid_path()retorna TRUEse

  • O caminho é <front>( <front>/directoryou caminhos semelhantes são excluídos)
  • O caminho é um caminho externo (a função url_is_external () retorna TRUE)
  • O caminho está associado a um retorno de chamada do menu

Além de usar URLs absolutos, a única solução é ter um módulo personalizado que define um retorno de chamada do menu associado ao caminho que você deseja usar.
Quando você usa a URL que aponta para um arquivo ou diretório, o servidor da Web deve mostrar esse arquivo ou diretório, sem chamar o Drupal. É o que acontece com o Apache, pois o arquivo .htaccess que acompanha o Drupal contém as seguintes diretivas:

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

No seu caso, o módulo personalizado deve conter código semelhante ao seguinte:

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

Você pode usar quaisquer valores para retorno de chamada de título e página , pois esse retorno de menu nunca deve ser chamado. O valor do retorno de chamada de acesso diz ao Drupal que todo usuário tem acesso a esse retorno de menu.

Como alternativa, você pode definir um retorno de chamada de menu associado a "alias_para_diretório /% menu_tail" que redireciona o usuário para o diretório que você deseja que ele veja (usando drupal_goto () ). Eu usaria essa solução quando o servidor não usasse o conteúdo de .htaccess e invocaria o Drupal mesmo quando a URL estiver apontando para um arquivo ou diretório existente.

kiamlaluno
fonte
3

Para mim, o seguinte foi o truque (no drupal 6).

Eu quero direcionar para outro URL no mesmo domínio, digamos que o Drupal esteja em execução http://www.example.come eu quero ter um link parahttp://www.example.com/frontend

No item de menu, insira como caminho:

http:/frontend

O menu drupal será vinculado a: http://www.example.com/frontend

Ao usar https, você deve inserir https: / frontend no campo de caminho do item de menu.

Paulo
fonte
Alguma idéia se isso funcionaria em 7 /
Martin Duys
Não sei, apenas tente.
Paul
Estou achando que esse método não está funcionando na versão 7.22.
10763 Rick
1
Isso funciona no Drupal 7.23. Eu tenho tentado fazer isso por um tempo, se eu puder, eu te
voto com mais frequência
1

Resolvi meus problemas de link com o seguinte:

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

Acontece que meu tema estava imprimindo o menu incorretamente, de modo que todos os itens eram relativos à minha localização atual (por exemplo, admin / logout, em vez de / logout).

Espero que isto ajude.

the_dillio
fonte
1

Eu usei o sql para substituir o link na estrutura do menu:

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

Não tenho certeza se eu precisava fazer isso, mas limpei os caches de menu.

streamfan
fonte
por que você deseja alterar a consulta? Não é recomendado.
gerl