¿Cómo creo enlaces de menú relativos?


10

Estoy ocupado trabajando en un sitio en mi host local que necesita vincular a un contenido que es independiente de Drupal.

Tengo las rutas de menú actuales configurados como esto: http://mylocalsite/the_folder_for_the_other_content. Si trato <front>/the_folder_for_the_other_contento /the_folder_for_the_other_content, o the_folder_for_the_other_content, me sale el error "La ruta 'whatever_I_use' no es válida o no tiene acceso a ella."

Cuando en vivo, obviamente, necesito todos los elementos del menú para señalar http://myrealsite/the_folder_for_the_other_content.

¿Cómo puedo configurarlo para que no tenga que editar todas las rutas del menú cuando entre en funcionamiento?


@irishbuzz tiene una solución alternativa para Drupal 6 a continuación, pero esperaba poder evitar hacer esto en Drupal 7. ¿Es esa una ilusión de mi parte?
Martin Duys

¿Drupal está instalado en el directorio raíz del servidor web?
kiamlaluno

No en mi versión localhost, pero cuando finalmente se active estará en la raíz de la carpeta public_html. ¿Eso cuenta como 'raíz del servidor web'?
Martin Duys

Por "directorio raíz del servidor web", me refiero al directorio que en Apache está configurado con la directiva "DocumentRoot" y que, por defecto, es el directorio public_html. Es el acceso al directorio de Apache cuando usa una URL como http://example.com/.
kiamlaluno

Entonces: sí, en última instancia, el sitio estará en el directorio raíz
Martin Duys

Respuestas:


4

La respuesta de Kiamlaluno no me funcionó del todo. El uso de% menu_tail produjo una tormenta de errores de que la función menu_tail_load estaba teniendo problemas con los argumentos faltantes:

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

Lo que funcionó para mí fue

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

Luego, podría servir archivos en la carpeta sitios / d8 / archivos (y subcarpetas) usando elementos de menú con rutas como sites/d8/files/Documents/MyFile.pdf

El sistema de menús generará un enlace como href="/drupal//sites/d8/files/Documents/MyFile.pdf"

Si no utiliza el módulo de menú personalizado, el sistema de menús rechazará una ruta que comience como se indicó anteriormente.

Si intenta utilizar una ruta como http:sites/d8/files/Documents/MyFile.pdf, generará un enlace como href="http:sites/d8/files/Documents/MyFile.pdf", que funcionará cuando esté en la raíz del sitio, pero cuando esté en una página de contenido, el navegador interpretará la URL relativa a la página de contenido, y no funcionará

Si utiliza una ruta como http:/sites/d8/files/Documents/MyFile.pdf, el sistema de menús la aceptará, pero el sistema de menús generará un enlace como href="http:/sites/d8/files/Documents/MyFile.pdf", que el navegador (al menos Safari) interpretará href="http://sites/d8/files/Documents/MyFile.pdf"y no intentará encontrar el servidor llamado "sitios".

(En una investigación adicional, la razón por la que el código que usa menu_tail falla es que necesita agregar los 'argumentos de carga', como se señala aquí: http://api.drupal.org/api/drupal/includes--menu.inc/function / menu_tail_load / 7. Si agrega 'load arguments' => array('%map', '%index'),a la definición de $ items en el código de kiamlaluno, funcionará. La cuestión de si menu_tail_load debería requerir los argumentos explícitos de carga también se discute aquí: http://drupal.org/node/298561 )

(No olvide habilitar su nuevo módulo, o el sistema de menús no aceptará los nuevos enlaces)


5

Cuando agrega un nuevo enlace, el enlace se valida desde menu_edit_item_validate () , que llama a drupal_valid_path () para verificar si la ruta es válida o si el usuario puede acceder a ella.
drupal_valid_path()devuelve TRUEsi

  • La ruta es <front>( <front>/directoryo se excluyen rutas similares)
  • El camino es un camino externo (la función url_is_external () retornos TRUE)
  • La ruta está asociada con una devolución de llamada de menú

Además de usar URL absolutas, la única solución es tener un módulo personalizado que defina una devolución de llamada de menú asociada con la ruta que desea usar.
Cuando utiliza la URL que apunta a un archivo o directorio, el servidor web debe mostrar ese archivo o directorio, sin invocar a Drupal. Eso es lo que sucede con Apache, ya que el archivo .htaccess que viene con Drupal contiene las siguientes directivas:

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

En su caso, el módulo personalizado debe contener un código similar al siguiente:

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

Puede usar cualquier valor para la devolución de llamada de título y página , ya que esa devolución de llamada de menú nunca debe llamarse. El valor de la devolución de llamada de acceso le dice a Drupal que cada usuario tiene acceso a esa devolución de llamada de menú.

Como alternativa, puede definir una devolución de llamada de menú asociada a "alias_for_directory /% menu_tail" que redirige al usuario al directorio que desea que vean (usando drupal_goto () ). Usaría esta solución cuando el servidor no usa el contenido de .htaccess, e invocaría a Drupal incluso cuando la URL apunte a un archivo o directorio existente.


3

Para mí lo siguiente hizo el truco (en drupal 6).

Quiero dirigirme a otra URL en el mismo dominio, digamos que Drupal se está ejecutando http://www.example.comy quiero tener un enlace ahttp://www.example.com/frontend

En el elemento del menú, ingrese como ruta:

http:/frontend

El menú de drupal se vinculará a: http://www.example.com/frontend

Cuando usa https, debe ingresar https: / frontend en el campo de ruta para el elemento del menú.


Alguna idea de si esto funcionaría en 7 /
Martin Duys

No sé, solo pruébalo.
Paul

Encuentro que este método no funciona a partir de la versión 7.22.
Rick

1
Esto funciona en Drupal 7.23. He estado tratando de hacer esto por un tiempo, si pudiera te
votaría


1

Usé sql para reemplazar el enlace en la estructura del menú:

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

No estoy seguro de si necesitaba hacer esto, pero luego eliminé los cachés del menú.


¿por qué querrías cambiar la consulta? No es recomendable
gerl
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.