Estoy en el punto de la experiencia de Drupal donde estoy tratando de resolver los desafíos de diseño del sitio a nivel de código personalizado usando las API de Drupal y Views. Como de costumbre, ¡mi intento aparentemente simple de resolver un problema me ha demostrado cuánto aún no sé!
Tengo un campo de referencia de nodo que apunta a un contenido de "hechos relacionados" utilizado por muchos tipos de contenido y subcategorías diferentes para cada uno de estos tipos. Si bien puedo crear una relación y mostrar los "hechos relacionados" para una vista, hay problemas. Por un lado, quiero que los hechos relacionados se coloquen en un bloque separado y que muestren una lista única de hechos relacionados para la lista completa de artículos proporcionados por la vista. Las vistas no manejan ningún duplicado para múltiples nid con la misma referencia de "hechos relacionados". Además, tendría que generar vistas separadas de "hechos relacionados" para cada tipo de contenido y subcategoría, que será un número bastante grande.
Si pudiera crear una vista de hechos relacionados separada que pueda aceptar una lista de nids como argumento, la vista de hechos relacionados podría simplificarse. Entonces mi pregunta es cómo hacer esto. Si bien es posible desde dentro de las vistas, estoy buscando una solución php de módulo personalizado , por lo que necesito lograr lo siguiente:
Extraiga los resultados de cualquiera de las vistas de 'tipo de contenido' como una lista de argumentos. Además de mostrar los resultados de la vista, necesito cargar la lista de NID que se muestran.
Llame a la vista de hechos relacionados y pásele la lista de nid para usar como filtro o filtro contextual en la vista de 'hechos relacionados'.
Información Adicional:
Usando esta estrategia, comencé definiendo una vista e intentando extraer los resultados de ella. Este intento condujo a un problema para encontrar los resultados en el objeto de vista ( vea esta pregunta ). Una vez que obtenga los resultados, tendré que generar otra vista que tenga esos resultados como filtros. He visto vistas implementadas desde el código como archivos de inclusión donde se codifican todos los parámetros, pero no he encontrado ejemplos que definan y generen una vista y manipulen los resultados usando una función php. Cualquier ejemplo o enlace sería apreciado.
Hasta ahora:
Dos respuestas han abordado el proceso para aplicar los resultados de una vista y colocarla en otra vista como filtro contextual. Pero todavía me enfrento al problema de tener docenas de tipos de contenido con al menos una docena de variaciones en el panel de visualización de contenido en cada uno. En lugar de vincular directamente cada vista con los hechos relacionados, necesitaré que cualquiera de mis vistas de contenido view1 pase sus resultados a una sola vista separada de 'hechos relacionados'.
CONTENT TYPE SUB-CATEGORY RELATED FACT (nid)
Type 1 --------- General Info 101, 105
Specifications 103, 105
Inspections 102
Quality
etc...
Type 2 ----------General Info 101, 106
Specifications 102, 103
Cost factors 107
etc...
View1 encuentra un tipo de contenido específico y contiene varios artículos de subcategoría ordenados por el valor en un campo de subcategoría. Además, contiene un campo de referencia de nodo para hechos relacionados. Vea uno de los filtros para un tipo de contenido y una subcategoría y tiene campos expuestos para mostrar y un campo oculto con los nodos de referencia de hechos relacionados.
View2 filtra los artículos de "hechos relacionados" y contiene un conjunto de filtros contextuales para nid (aunque la configuración se aplica a la URL)
Usando el código en la respuesta de Letharion, el bucle foreach en la línea 6 está compilando una lista de ID de artículos, no los identificadores de hechos relacionados (los artículos contienen una referencia a hechos relacionados, pero los hechos relacionados no tienen una referencia de nodo a artículos) . Necesito extraer los identificadores de hechos relacionados del campo de hechos en cada nodo. He incluido el campo de hechos en la definición de View1, pero no puedo encontrar el resultado desde el comando dpm ($ node); se ha estado bloqueando y no sé dónde se almacenan los valores en la matriz.
Como habrá más de una View1 clonada para diferentes tipos de contenido, pensé que podría tener sentido usar hook_views_post_execute y lo he codificado de la siguiente manera:
function mymodule_views_post_execute (&$sourceview) {
$nids = '';
foreach($sourceview->result as $node) {
$nids += $node->nid . ','; //I need field name for $node->facts
}
$nids = rtrim($nids, ',');
$view = views_get_view('get_related');
//dpm($nids); // Fatal error: Cannot unset string offsets...
$view->execute_display('panel_pane_1', array($nids));
}
Finalmente, no estoy seguro de si tengo que dirigir la visualización de la vista a la ubicación adecuada o si esto se hace simplemente colocando el panel de contenido de hechos relacionados en la ubicación del panel a través de la interfaz de usuario de paneles y dejar que los paneles manejen el resto.
Respuestas:
Justo al lado de la parte superior de mi cabeza
Con las vistas 'get_nids' y 'get_related', get_related toma un
nid
argumento, que está configurado para aceptar múltiples valores. Esta opción está oculta en "más", en la parte inferior de la ventana de configuración.Opción 1:
Opcion 2:
Agregue un tipo de visualización de "contexto" a get_nids y pase ese contexto como argumento a una pantalla de panel de contenido de get_related. Desafortunadamente, tendría que adivinar que los contextos de Vistas carecen de soporte para comprimir múltiples resultados en un solo contexto, por lo que puede requerir una solicitud de función en Ctools.
Opcion 3:
Beth tiene una excelente sugerencia en un comentario, que utiliza EntityFieldQuery , para cuando desee una solución de código puro, que también funcionaría con MongoDB . Sin embargo, las vistas tienen la ventaja de que la mayor parte del trabajo se puede realizar en una interfaz de usuario, lo que a menudo es conveniente.
fuente
Buscar campos dentro de un nodo y devolver una lista de NID es exactamente lo que nació para hacer EntityFieldQueries . (Ver también: mi propia pregunta sobre el tema ).
Un ejemplo de mi código, que se ejecuta al enviar el formulario web, y en el que busco nodos de tipo "Clave de respuesta de prueba" para encontrar uno (s) con el campo "Referencia de prueba" completado con el NID del formulario web que se está validando actualmente :
Luego, si realmente desea cargar valores de los campos en los nodos, usaría
node_load
para obtener más información de los nodos que desee, de esta manera:Ahora
$ans_node
es una matriz (u objeto, lo olvido) que contiene toda la información en todos los campos del nodo. Voilá!fuente
Ok, una solución codificada (hay pocas) pero aquí hay una:
Paso 2 código
¿Debería ser esta una respuesta separada? o una edición?
fuente