'Ente Planificador', 'page callback' => 'politicas_proyectos_get_politicas_js', 'access arguments' => array('ver planificador'), 'type' => MENU_CALLBACK, ); return $items; } function politicas_proyectos_get_politicas_js($campo = '') { $form_state = array('submitted' => FALSE); $form_build_id = $_POST['form_build_id']; $form = form_get_cache($form_build_id, $form_state); $politica = array(); $arreglo = array(); if (isset($_POST[$form['#politicas_campo']]['nid']) && is_array($_POST[$form['#politicas_campo']]['nid'])) { $arreglo = $_POST[$form['#politicas_campo']]['nid']; } elseif (isset($_POST[$form['#politicas_campo']]) && is_array($_POST[$form['#politicas_campo']])) { $arreglo = $_POST[$form['#politicas_campo']]; } foreach($arreglo as $valor) { $valor = intval($valor); if ($valor) { $politica[$valor] = $valor; } } $form['#causas'] = array(); $form['#cambios'] = array(); $form['#descriptores'] = array(); $form['#formas_solucion'] = array(); $form['#carabobo'] = array(); $form['#all_descriptores'] = array(); $form['#formas_solucion'] = array(); $form['#pdlp'] = array(); $form['#politica'] = $politica; $output = t('No ha seleccionado una politica'); if ($politica) { $busca_causas = array(); foreach($politica as $id) { $busca_causas += $form['#causas_criticas'][$id]; } $descriptores_c = _politicas_proyectos_get_causas_all_causas('criticas', $busca_causas); $form['#formas_solucion'] = politicas_proyectos_get_formas_solucion($busca_causas); $all_descriptores = _politicas_proyectos_situacion_actual_listar_all_descriptores($descriptores_c); $form['#all_descriptores'] = $all_descriptores; $form['#descriptores'] = $all_descriptores['descriptores']; $form['#causas'] = $all_descriptores['causas']; $form['#cambios'] = $all_descriptores['cambios']; $form['#pdlp'] = $all_descriptores['pdlp']; $form['#carabobo'] = $all_descriptores['carabobo']; $output = _politicas_proyectos_display_politicas($form['#all_descriptores'], $form['#formas_solucion']); } //$form += $new_form; form_set_cache($form_build_id, $form, $form_state); $form += array( '#post' => $_POST, '#programmed' => FALSE, ); // Rebuild the form. $form = form_builder($_POST['form_id'], $form, $form_state); // Add the new element to the stored form. Without adding the element to the // form, Drupal is not aware of this new elements existence and will not // process it. We retreive the cached form, add the element, and resave. print drupal_to_js(array('data' => $output, 'status' => true)); exit(); } /* * Implementation of _politicas_proyectos_situacion_actual_listar_all_descriptores() * Get ente's descriptores * Inputs: - $ente_planificador (integer): ente planificador nid - $tipo (integer): plann type - $year (integer): descriptor year creation, if no available 'situacional_actual_preliminar_anho_creacion' variable will be used * Outputs: - Descriptores (array nid descriptor): + body: Description descriptor + title: Acronimo + nid: Descriptor nid node reference + year: descriptor year creation + clasificacion: descriptor type / tid: taxonomy term + causas: causas list (array nid causa-descriptor): / body: Description causa / title: Acronimo causa / nid: Causa nid node reference / descriptor: Descriptor nid node reference + solucion: solucion list (array nid solucion-descriptor): / body: Description solucion / title: Acronimo solucion / nid: Solucion nid node reference / descriptor: Descriptor nid node reference */ function _politicas_proyectos_situacion_actual_listar_all_descriptores($causas = array()) { //se obtienen los descriptores $descriptores = array(); $causas_load = array(); $cambios_load = array(); $pdlp_load = array(); $carabobo_load = array(); $sql = "SELECT c.nid, n.title, nr.body FROM {content_type_descriptores} AS c INNER JOIN {node} AS n ON c.nid = n.nid AND c.vid = n.vid AND n.type = 'descriptores' INNER JOIN {node_revisions} AS nr ON c.nid = nr.nid AND c.vid = nr.vid"; $inputs = array(); $inputs_c = array(); if (is_array($causas) && count($causas)) { $implode_causas_sql = array(); foreach($causas as $id => $descriptoresl) { $implode_causas_sql[] = '%d'; $inputs_c[] = $id; foreach($descriptoresl as $descriptor) { $implode_sql[] = '%d'; $inputs[] = $descriptor; } } if (count($implode_sql)) { $sql .= ' WHERE c.nid IN (' . implode(', ', $implode_sql) . ')'; } } $tipo_plan = 'situacion_actual'; $planns = _situacion_actual_preliminar_get_planns(); $plan = $planns[$tipo_plan]; $sql .=' AND c.field_descriptores_' . $plan['short'] . '_value = %d'; $inputs[] = 1; $sql .=' ORDER BY c.nid'; $result = db_query($sql, $inputs); $inpunts = array(); $inpunts_values = array(); $solucion = array(); while($descriptor = db_fetch_object($result)) { $descriptores[$descriptor->nid] = array( 'body' => $descriptor->body, 'title' => $descriptor->title, 'nid' => $descriptor->nid, 'year' => $year_display, 'clasificacion' => array(), 'causas' => array(), 'cambios' => array(), ); $inpunts[] = '%d'; $inpunts_values[] = $descriptor->nid; } if (count($inpunts)) { $implode = implode(',', $inpunts); //Se obtienen la clasificacion de los descriptores $sql = 'SELECT c.field_descriptores_clasificacion_value AS tid, c.nid FROM {content_field_descriptores_clasificacion} AS c INNER JOIN {node} AS n ON n.nid = c.nid AND n.vid = c.vid WHERE c.nid IN (' . $implode . ')'; $result = db_query($sql, $inpunts_values); while($clasificacion = db_fetch_object($result)) { $descriptores[$clasificacion->nid]['clasificacion'][$clasificacion->tid] = $clasificacion->tid; } //se obtienen las causas //field_descriptores_causa $sql = "SELECT c.field_descriptores_causa_nid as nid, c.nid as descriptor, n.title, nr.body FROM {content_field_descriptores_causa} AS c INNER JOIN {node} AS n ON c.field_descriptores_causa_nid = n.nid AND n.type = 'causas' INNER JOIN {node} AS n1 ON c.nid = n1.nid AND c.vid = n1.vid INNER JOIN {node_revisions} AS nr ON n.nid = nr.nid AND n.vid = nr.vid WHERE c.nid IN (" . $implode . ")"; $inpunts_d = $inpunts_values; if (count($implode_causas_sql)) { $sql .= ' AND c.field_descriptores_causa_nid IN (' . implode(', ', $implode_causas_sql) . ')'; $inpunts_d = array_merge($inpunts_values, $inputs_c); } $sql .= ' ORDER BY c.field_descriptores_causa_nid'; $result = db_query($sql, $inpunts_d); while($causa = db_fetch_object($result)) { $causas_load[$causa->nid] = array( 'descriptor' => $causa->descriptor, 'body' => $causa->body, 'nid' => $causa->nid, ); $descriptores[$causa->descriptor]['causas'][$causa->nid] = array( 'body' => $causa->body, 'nid' => $causa->nid, 'title' => $causa->title, 'descriptor' => $causa->descriptor, ); } //se obtienen los cambios //field_descriptor_cambio_nid $sql_implode_cambios = array(); $inputs_cambios = array(); $sql = "SELECT c.field_descriptor_cambio_nid as nid, c.nid as descriptor, n.title, nr.body FROM {content_field_descriptor_cambio} AS c INNER JOIN {node} AS n ON c.field_descriptor_cambio_nid = n.nid AND n.type = 'cambios' INNER JOIN {node} AS n1 ON c.nid = n1.nid AND c.vid = n1.vid INNER JOIN {node_revisions} AS nr ON n.nid = nr.nid AND n.vid = nr.vid WHERE c.nid IN (" . $implode . ") ORDER BY c.field_descriptor_cambio_nid"; $result = db_query($sql, $inpunts_values); while($meta = db_fetch_object($result)) { $cambios_load[$meta->nid] = array( 'descriptor' => $meta->descriptor, 'body' => $meta->body, 'nid' => $meta->nid, 'pdlp' => array(), 'carabobo' => array(), ); $sql_implode_cambios[] = '%d'; $inputs_cambios[] = $meta->nid; $descriptores[$meta->descriptor]['cambios'][$meta->nid] = array( 'body' => $meta->body, 'nid' => $meta->nid, 'title' => $meta->title, 'descriptor' => $meta->descriptor, 'pdlp' => array(), 'carabobo' => array(), ); } //se obtienen pdlp y carabobo if (count($inputs_cambios)) { $implode = implode(', ', $sql_implode_cambios); $sql = "SELECT p.*, t.name, t.description FROM {content_field_cambios_pdp} AS p INNER JOIN {node} AS n ON n.nid = p.nid AND n.vid = p.vid AND n.type = 'cambios' INNER JOIN {term_data} AS t ON t.tid = p.field_cambios_pdp_value WHERE p.nid IN (" . $implode . ") ORDER BY t.name"; $result = db_query($sql, $inputs_cambios); while($meta = db_fetch_object($result)) { if ($meta->field_cambios_pdp_value) { $descriptores[$cambios_load[$meta->nid]['descriptor']]['cambios'][$meta->nid]['pdlp'][$meta->delta][$meta->field_cambios_pdp_value] = $meta->name . ' ' . $meta->description; $cambios_load[$meta->nid]['pdlp'][$meta->delta][$meta->field_cambios_pdp_value] = $meta->name . ' ' . $meta->description; $pdlp_load[$meta->delta][$meta->field_cambios_pdp_value] = $meta->name . ' ' . $meta->description; } } $sql = "SELECT p.*, t.plan_carabobo_meta_value AS carabobo FROM {content_field_cambios_carabobo} AS p INNER JOIN {node} AS n ON n.nid = p.nid AND n.vid = p.vid AND n.type = 'cambios' INNER JOIN {term_fields_term} AS t ON t.tid = p.field_cambios_carabobo_value WHERE p.nid IN (" . implode(', ', $inputs_cambios) . ")"; $result = db_query($sql, $inputs_cambios); while($meta = db_fetch_object($result)) { if ($meta->field_cambios_carabobo_value) { $descriptores[$cambios_load[$meta->nid]['descriptor']]['cambios'][$meta->nid]['carabobo'][$meta->delta][$meta->field_cambios_carabobo_value] = $meta->carabobo; $cambios_load[$meta->nid]['carabobo'][$meta->delta][$meta->field_cambios_carabobo_value] = $meta->carabobo; $carabobo_load[$meta->field_cambios_carabobo_value] = $meta->carabobo; } } } } return array( 'descriptores' => $descriptores, 'causas' => $causas_load, 'cambios' => $cambios_load, 'pdlp' => $pdlp_load, 'carabobo' => $carabobo_load, ); } /* * hook_form_alter() */ function politicas_proyectos_form_alter(&$form, $form_state, $form_id) { if ($form_id == 'proyectos_operativos_proyecto_genera_campos_form') { if (!isset($_SESSION['proyectos_operativos_mostrar_campos'][$form['#node']->nid]) || !count($_SESSION['proyectos_operativos_mostrar_campos'][$form['#node']->nid])) { $form['db']['areae']['#options']['field_proyectos_descript'] = t('Descriptores (Problemas)'); $form['db']['areae']['#options']['field_proyectos_cambios'] = t('Cambios en la situación Actual'); $form['db']['areae']['#options']['field_proyectos_causasc'] = t('Causas Críticas'); //se borra el campo consecuencias unset($form['ip']['enunciadop']['#options']['field_proyecto_consecuencias']); } } if ($form_id == 'proyectos_operativos_proyecto_basico_form') { $new_submit = array(); //se coloca el submit de pd $new_submit[] = '_politicas_proyectos_basico_form_pd_submit'; foreach($form['#submit'] as $submit) { $new_submit[] = $submit; } $form['#submit'] = $new_submit; //se agregan los nuevos campos if (isset($form['field_proyecto_pndes'])) { unset($form['field_proyecto_pndes']); } // $form['field_proyecto_pndes']['#access'] = FALSE; $form['#proyectos_operativos_fields'][] = 'field_proyecto_problemas'; $form['#proyectos_operativos_fields'][] = 'field_proyectos_descript'; $form['#proyectos_operativos_fields'][] = 'field_proyecto_causas'; $form['#proyectos_operativos_fields'][] = 'field_proyectos_causasc'; $form['#proyectos_operativos_fields'][] = 'field_proyectos_cambios'; $form['#proyectos_operativos_fields'][] = 'field_proyectos_solucion'; $form['#proyectos_operativos_fields'][] = 'field_proyecto_pndes'; $form['#proyectos_operativos_fields'][] = 'field_proyectos_carabobo'; $politicas = _politicas_proyectos_references($form['#ente_planificador']->nid, 1); $form['#politicas'] = $politicas; $form['#causas'] = array(); $form['#cambios'] = array(); $form['#descriptores'] = array(); $form['#formas_solucion'] = array(); $form['#mpcc'] = array(); $form['#pdlp'] = array(); $causas_criticas = _politicas_proyectos_get_politicas_causas($form['#politicas']['politicas']); $politicas = array(); //solo deje aquellas politicas que contengan causas criticas foreach($form['#politicas']['politicas'] as $id => $pol) { if (isset($causas_criticas[$id]) && is_array($causas_criticas[$id]) && count($causas_criticas[$id])) { $politicas[$id] = $pol; } } $form['#politicas']['politicas'] = $politicas; $form['#causas_criticas'] = $causas_criticas; $form['#carabobo'] = array(); $politica = array(); if (isset($form['#node']->field_proyecto_mcti) && is_array($form['#node']->field_proyecto_mcti)) { foreach($form['#node']->field_proyecto_mcti as $valor) { if ($valor['nid']) { $politica[$valor['nid']] = $valor['nid']; } } } //no deje enviar el formulario si no existen politicas para este ente $form['buttons']['registrar']['#access'] = is_array($form['#politicas']['politicas']) && count($form['#politicas']['politicas']); if (!count($politica) && is_array($form['#politicas']['politicas']) && count($form['#politicas']['politicas'])) { //se obtiene el primer elemento del arreglo $key = key($form['#politicas']['politicas']); $politica[$key] = $key; } $form['#politicas_campo'] = 'field_proyecto_mcti'; $form['#politica'] = $politica; if (count($form['#politica'])) { $busca_causas = array(); foreach($form['#politica'] as $id) { if (isset($form['#causas_criticas'][$id]) && is_array($form['#causas_criticas'][$id]) && count($form['#causas_criticas'][$id])) { foreach($form['#causas_criticas'][$id] as $causa) { $busca_causas[$causa] = $causa; } } } $descriptores_c = _politicas_proyectos_get_causas_all_causas('criticas', $busca_causas); $form['#formas_solucion'] = politicas_proyectos_get_formas_solucion($busca_causas); $all_descriptores = _politicas_proyectos_situacion_actual_listar_all_descriptores($descriptores_c); $form['#all_descriptores'] = $all_descriptores; $form['#descriptores'] = $all_descriptores['descriptores']; $form['#causas'] = $all_descriptores['causas']; $form['#cambios'] = $all_descriptores['cambios']; $form['#pdlp'] = $all_descriptores['pdlp']; $form['#carabobo'] = $all_descriptores['carabobo']; } } if ($form_id == 'proyectos_operativos_proyecto_indicadores_form') { $arreglo = array( 'field_proyecto_causas' => 'field_proyecto_causas', 'field_proyecto_problemas' => 'field_proyecto_problemas', 'field_proyecto_consecuencias' => 'field_proyecto_consecuencias', ); foreach($arreglo as $id) { if (isset($form['field_proyecto_causas'])) { unset($form[$id]); $title = $form['#field_info'][$id]['widget']['label']; unset($form['#field_info'][$id]); $items = array(); if ($id != field_proyecto_consecuencias) { foreach($form['#node']->{$id} as $valor) { $items[] = $valor['value']; } $form[$id] = array( '#value' => '
' . theme('item_list', $items) . '
', ); } } } $new_fields = array(); foreach($form['#proyectos_operativos_fields'] as $id) { if (!isset($arreglo[$id])) { $new_fields[] = $id; } } $form['#proyectos_operativos_fields'] = $new_fields; } } /* * Implementation of proyectos_operativos_proyecto_basico_form_submit(). * Guardar formulario de datos basicos (proyectos operativos). */ function _politicas_proyectos_basico_form_pd_submit($form, &$form_state) { //se agregan los valores de descriptores, causas y cambios $arreglo = array(); $arregloi = array(); $campos = array( 'descriptores' => array( 'value' => 'field_proyecto_problemas', 'nid' => 'field_proyectos_descript', ), 'causas' => array( 'value' => 'field_proyecto_causas', 'nid' => 'field_proyectos_causasc', ), 'cambios' => array( 'nid' => 'field_proyectos_cambios', ), ); $solucion = array(); foreach($campos as $id1 => $tipos) { foreach($tipos as $valor => $campo) { $arreglo = array(); foreach($form['#' . $id1] as $id => $nodo) { $arreglo[][$valor] = $valor == 'nid'? $id : check_plain($nodo['body']); if ($id1 == 'causas' && $valor == 'value') { foreach($form['#formas_solucion'][$id] as $texto) { $solucion[][$valor] = $texto; } } } $form_state['values'][$campo] = $arreglo; } } //se agregan los valores de formas de solucion $form_state['values']['field_proyectos_solucion'] = $solucion; //se agregan los valores de plan de la patria $pdlp = array(); for($i = 0; $i < 4 ; $i++) { if (is_array($form['#pdlp'][$i])) { foreach($form['#pdlp'][$i] as $id => $valor) { if ($id) { $pdlp[] = $id; } } } } $form_state['values']['field_proyecto_pndes']['tids'] = $pdlp; //carabobo $arreglo = array(); foreach($form['#carabobo'] as $id => $valor) { if ($id) { $arreglo[]['value'] = $id; } } $form_state['values']['field_proyectos_carabobo'] = $arreglo; $form_state['values']['field_proyecto_mcti'] = array(); foreach($form['#politica'] as $politica) { $form_state['values']['field_proyecto_mcti'][]['nid'] = $politica; } } function _politicas_proyectos_display_politicas($descriptores, $formas_solucion) { $output = ''; $arreglot = array( 'descriptores' => t('Problemas (Descriptores)'), 'causas' => t('Causas'), 'cambios' => t('Cambios en la Situación Actual'), ); $solucion = array(); foreach($arreglot as $id1 => $texto) { $output .= '
'; $arreglo = array(); foreach($descriptores[$id1] as $id => $nodo) { $arreglo[] = $nodo['body']; if ($id1 == 'causas') { $solucion = array_merge($solucion, $formas_solucion[$id]); } } $output .= theme('item_list', $arreglo); $output .= '
'; if ($id1 == 'causas') { $output .= '
'; $output .= theme('item_list', $solucion); $output .= '
'; } } //pdlp $output .= '
' . t('Plan de la Patria') . ''; $arreglo = array(t('Objetivos Históricos'), t('Objetivos Nacionales'), t('Objetivos Estratégicos'), t('Objetivos Generales')); foreach($arreglo as $id => $texto) { $output .= '
'; $output .= theme('item_list', $descriptores['pdlp'][$id]); $output .= '
'; } $output .= '
'; $output .= '
'; $output .= theme('item_list', $descriptores['carabobo']); $output .= '
'; return $output; } function _politicas_proyectos_get_politicas_causas($politicas = array()) { $causas = array(); if (count($politicas)) { $sql = "SELECT p.field_politicas_causas_nid AS causa, p.nid FROM {content_field_politicas_causas} AS p INNER JOIN {node} AS n ON n.nid = p.nid AND n.vid = p.vid INNER JOIN {node} AS nc ON nc.nid = p.field_politicas_causas_nid INNER JOIN {content_type_causas} AS cc ON cc.nid = nc.nid AND cc.vid = nc.vid AND cc.field_causa_critica_value = '1' WHERE p.nid in("; $inputs = array(); $implode_sql = array(); foreach($politicas as $id => $politica) { $causas[$id] = array(); $implode_sql[] = '%d'; $inputs[] = $id; } $sql .= implode(', ', $implode_sql) . ')'; $result = db_query($sql, $inputs); while($causa = db_fetch_object($result)) { $causas[$causa->nid][$causa->causa] = $causa->causa; } } return $causas; } /* * Implementation of _politicas_proyectos_get_causas_all_causas() * Obtiene las causas criticas por tipo de plan */ function _politicas_proyectos_get_causas_all_causas($tipo = 'posibles', $causas = array()){ $tabla = ($tipo == 'posibles')? 'content_field_descriptores_posibles' : 'content_field_descriptores_criticas'; $campo = 'field_descriptores_' . $tipo . '_nid'; $descriptores = array(); if (count($causas)) { $sql = "SELECT d.*, ds." . $campo . " AS causa FROM {" . $tabla . "} AS ds INNER JOIN {content_type_descriptores} AS d ON d.nid = ds.nid AND d.vid = ds.vid INNER JOIN {node} AS n ON n.nid = ds.nid AND n.vid = ds.vid INNER JOIN {node} AS nc ON nc.nid = ds." . $campo . " INNER JOIN {content_type_causas} AS cc ON cc.nid = nc.nid AND cc.vid = nc.vid AND cc.field_causa_critica_value = '1' WHERE "; $inputs = array(); foreach($causas as $causa) { $implode_sql[] = '%d'; $inputs[] = $causa; } $sql .= ' ds.' . $campo . ' in (' . implode(', ', $implode_sql) . ')'; $result = db_query($sql, $inputs); $descriptores = array(); while($descriptor = db_fetch_object($result)) { if ($descriptor->nid && $descriptor->causa) { $descriptores[$descriptor->causa][$descriptor->nid] = $descriptor->nid; } } } return $descriptores; } function politicas_proyectos_get_formas_solucion($causas = array()) { $soluciones = array(); if (count($causas)) { $implode_sql = array(); $inputs = array(); $sql = "SELECT c.field_causa_solucion_value as value, c.delta, c.nid FROM {content_field_causa_solucion} AS c INNER JOIN {node} AS n ON n.nid = c.nid AND n.vid = c.vid WHERE c.nid IN ("; foreach($causas as $causa) { $implode_sql[] = '%d'; $inputs[] = $causa; } $sql .= implode(', ', $implode_sql) . ')'; $soluciones = array(); $result = db_query($sql, $inputs); while($solucion = db_fetch_object($result)) { $soluciones[$solucion->nid][$solucion->delta] = $solucion->value; } } return $soluciones; } /** * Implementation of hook_theme(). */ function politicas_proyectos_theme() { return array( 'politicas_direccionales_select' => array( 'arguments' => array('element' => NULL), ), 'politicas_proyectos_formatter_body' => array( 'arguments' => array('element'), 'function' => 'theme_politicas_proyectos_formatter_body', ), 'politicas_proyectos_formatter_pndes_0' => array( 'arguments' => array('element' => NULL, $html = TRUE, $unique = FALSE), 'function' => 'theme_politicas_proyectos_formatter_generic', ), 'politicas_proyectos_formatter_pndes_1' => array( 'arguments' => array('element' => NULL, $html = TRUE, $unique = FALSE), 'function' => 'theme_politicas_proyectos_formatter_generic', ), 'politicas_proyectos_formatter_pndes_2' => array( 'arguments' => array('element' => NULL, $html = TRUE, $unique = FALSE), 'function' => 'theme_politicas_proyectos_formatter_generic', ), 'politicas_proyectos_formatter_pndes_3' => array( 'arguments' => array('element' => NULL, $html = TRUE, $unique = FALSE), 'function' => 'theme_politicas_proyectos_formatter_generic', ), 'politicas_proyectos_formatter_pndeso_0' => array( 'arguments' => array('element' => NULL), 'function' => 'theme_politicas_proyectoso_formatter_generic', ), 'politicas_proyectos_formatter_pndeso_1' => array( 'arguments' => array('element' => NULL), 'function' => 'theme_politicas_proyectoso_formatter_generic', ), 'politicas_proyectos_formatter_pndeso_2' => array( 'arguments' => array('element' => NULL), 'function' => 'theme_politicas_proyectoso_formatter_generic', ), 'politicas_proyectos_formatter_pndeso_3' => array( 'arguments' => array('element' => NULL), 'function' => 'theme_politicas_proyectoso_formatter_generic', ), 'politicas_proyectos_formatter_pndesc_0' => array( 'arguments' => array('element' => NULL, $html = TRUE, $unique = FALSE), 'function' => 'theme_politicas_proyectos_formatter_generic', ), 'politicas_proyectos_formatter_pndesc_1' => array( 'arguments' => array('element' => NULL, $html = TRUE, $unique = FALSE), 'function' => 'theme_politicas_proyectos_formatter_generic', ), 'politicas_proyectos_formatter_pndesc_2' => array( 'arguments' => array('element' => NULL, $html = TRUE, $unique = FALSE), 'function' => 'theme_politicas_proyectos_formatter_generic', ), 'politicas_proyectos_formatter_pndesc_3' => array( 'arguments' => array('element' => NULL, $html = TRUE, $unique = FALSE), 'function' => 'theme_politicas_proyectos_formatter_generic', ), 'politicas_proyectos_formatter_metaspcc' => array( 'arguments' => array('element' => NULL), 'function' => 'theme_politicas_proyectos_formatter_metaspcc', ), ); } /** * Proxy theme function for 'full' and 'teaser' nodereference field formatters. */ function theme_politicas_proyectos_formatter_body($element) { static $recursion_queue = array(); $output = ''; if (!empty($element['#item']['safe']['nid'])) { $nid = $element['#item']['safe']['nid']; $node = $element['#node']; $field = content_fields($element['#field_name'], $element['#type_name']); // If no 'referencing node' is set, we are starting a new 'reference thread' if (!isset($node->referencing_node)) { $recursion_queue = array(); } $recursion_queue[] = $node->nid; if (in_array($nid, $recursion_queue)) { // Prevent infinite recursion caused by reference cycles: // if the node has already been rendered earlier in this 'thread', // we fall back to 'default' (node title) formatter. return theme('nodereference_formatter_default', $element); } $referenced_node = _politicas_proyectos_load_politica($nid); if ($referenced_node) { $referenced_node->referencing_node = $node; $referenced_node->referencing_field = $field; $output = check_plain($referenced_node->body); } } return $output; } /** * Theme function for 'default' text field formatter. */ function theme_politicas_proyectos_formatter_metaspcc($element) { foreach (element_children($element) as $key) { if (isset($element[$key]['#item']['value'])) { $selection[] = $element[$key]['#item']['value']; } } $items = array(); foreach($selection as $value){ $term = taxonomy_get_term($value); if ($term) { $valores = term_fields_get_fields_values($term); $items[] = check_plain($valores['plan_carabobo_meta_value']); } } return theme('item_list', $items); } /** * Theme function for HS Content Taxonomy formatters. * */ function theme_politicas_proyectoso_formatter_generic($element) { list($formatter, $level) = explode('_', $element['#formatter']); $output = theme('politicas_proyectos_formatter_pndes_' . $level, $element, FALSE, TRUE); return $output; } /** * Theme function for HS Content Taxonomy formatters. * */ function theme_politicas_proyectos_formatter_generic($element, $html = TRUE, $unique = FALSE) { $output = ''; if (module_exists('hierarchical_select')) { // Extract required field information. // $element contains only field name; so we use cck function to get more info. $field = content_fields($element['#field_name'], $element['#type_name']); $field_name = $field['field_name']; $vid = $field['vid']; $tid = (empty($field['tid'])) ? 0 : $field['tid']; $depth = (empty($field['depth'])) ? 0 : $field['depth']; // Get the config for this field. require_once(drupal_get_path('module', 'hierarchical_select') .'/includes/common.inc'); $config_id = "content-taxonomy-$field_name"; $config = hierarchical_select_common_config_get($config_id); $config += array( 'module' => 'hs_content_taxonomy_description', 'params' => array( 'vid' => $vid, 'tid' => $tid, 'depth' => $depth, ), ); $selection = array(); // Cycle through elements. foreach (element_children($element) as $key) { if (isset($element[$key]['#item']['value'])) { $selection[] = $element[$key]['#item']['value']; } } // It is said that formatter theme function is called even if field is empty. if (empty($selection)) { return $output; } // Generate a dropbox out of the selection. This will automatically // calculate all lineages for us. $dropbox = _hierarchical_select_dropbox_generate($config, $selection); // Actual formatting. // In 6.x formatter is fully themable // We theme each lineage using additional theme function $num_items = count($dropbox->lineages); $flip = array('even' => 'odd', 'odd' => 'even'); $class = 'even'; $terms = array(); list($formatter, $level) = explode('_', $element['#formatter']); $sufix = $html? '' : ''; foreach ($dropbox->lineages as $i => $lineage) { $term = isset($lineage[$level]['value']) ? taxonomy_get_term($lineage[$level]['value']) : 0; if ($term && $term->tid && !isset($terms[$term->tid])) { $terms[$term->tid] .= $formatter == 'pndes' || $formatter == 'pndeso'? $term->name : $term->name . HS_CONTENT_TAXONOMY_DESCRIPTION_SEP . $term->description; } } if ($unique) { //extract first element $key = key($terms); $new_array = array(); $new_array[$key] = $terms[$key]; $terms = $new_array; } $output = implode(' | ',$terms); // Add the CSS. //drupal_add_css(drupal_get_path('module', 'hierarchical_select') .'/hierarchical_select.css'); } return $output; } /** * Implementation of _politicas_proyectos_load_politica(). * Load node */ function _politicas_proyectos_load_politica($nid){ $node = 0; if ($nid) { $sql = 'SELECT n.nid, nr.body FROM {node} AS n INNER JOIN {node_revisions} AS nr ON nr.nid = n.nid AND nr.vid = n.vid WHERE n.nid = %d'; $result = db_query($sql, $nid); $node = db_fetch_object($result); } return $node; } //---------------------------------------------------------------------------- // CCK hooks. /** * Implementation of hook_widget_info(). */ function politicas_proyectos_widget_info() { return array( 'politicas_direccionales_select' => array( 'label' => 'Enlace a Politicas Direccionales', 'field types' => array('nodereference'), 'multiple values' => CONTENT_HANDLE_MODULE, 'callbacks' => array( 'default value' => CONTENT_CALLBACK_DEFAULT, ), ), ); } /** * Implementation of hook_field_formatter_info(). */ function politicas_proyectos_field_formatter_info() { return array( 'body' => array( 'label' => t('Body'), 'field types' => array('nodereference'), 'multiple values' => CONTENT_HANDLE_CORE, ), 'pndes_0' => array( 'label' => t('Nivel 0'), 'field types' => array('content_taxonomy'), 'multiple values' => CONTENT_HANDLE_MODULE, ), 'pndes_1' => array( 'label' => t('Nivel 1'), 'field types' => array('content_taxonomy'), 'multiple values' => CONTENT_HANDLE_MODULE, ), 'pndes_2' => array( 'label' => t('Nivel 2'), 'field types' => array('content_taxonomy'), 'multiple values' => CONTENT_HANDLE_MODULE, ), 'pndes_3' => array( 'label' => t('Nivel 3'), 'field types' => array('content_taxonomy'), 'multiple values' => CONTENT_HANDLE_MODULE, ), 'pndeso_0' => array( 'label' => t('Nivel 0 (ONAPRE)'), 'field types' => array('content_taxonomy'), 'multiple values' => CONTENT_HANDLE_MODULE, ), 'pndeso_1' => array( 'label' => t('Nivel 1 (ONAPRE)'), 'field types' => array('content_taxonomy'), 'multiple values' => CONTENT_HANDLE_MODULE, ), 'pndeso_2' => array( 'label' => t('Nivel 2 (ONAPRE)'), 'field types' => array('content_taxonomy'), 'multiple values' => CONTENT_HANDLE_MODULE, ), 'pndeso_3' => array( 'label' => t('Nivel 3 (ONAPRE)'), 'field types' => array('content_taxonomy'), 'multiple values' => CONTENT_HANDLE_MODULE, ), 'pndesc_0' => array( 'label' => t('Nivel 0 (Con Descripción)'), 'field types' => array('content_taxonomy'), 'multiple values' => CONTENT_HANDLE_MODULE, ), 'pndesc_1' => array( 'label' => t('Nivel 1 (Con Descripción)'), 'field types' => array('content_taxonomy'), 'multiple values' => CONTENT_HANDLE_MODULE, ), 'pndesc_2' => array( 'label' => t('Nivel 2 (Con Descripción)'), 'field types' => array('content_taxonomy'), 'multiple values' => CONTENT_HANDLE_MODULE, ), 'pndesc_3' => array( 'label' => t('Nivel 3 (Con Descripción)'), 'field types' => array('content_taxonomy'), 'multiple values' => CONTENT_HANDLE_MODULE, ), 'metaspcc' => array( 'label' => t('Metas del Plan Campaña de Carabobo'), 'field types' => array('content_taxonomy'), 'multiple values' => CONTENT_HANDLE_MODULE, ), ); } /** * Implementation of hook_widget_settings(). */ function politicas_proyectos_widget_settings($op, $widget) { switch ($op) { case 'form': $form = array(); $situacion_actual = isset($widget['situacion_actual']) ? $widget['situacion_actual'] : FALSE; if ($widget['type'] == 'politicas_direccionales_select') { $form['situacion_actual'] = array( '#type' => 'checkbox', '#title' => t('Permitir solo entes que tienen S.A:'), '#default_value' => $situacion_actual, ); } else { $form['situacion_actual'] = array('#type' => 'hidden', '#value' => $match); } return $form; case 'save': return array('situacion_actual'); } } /** * Implementation of hook_widget(). * * Attach a single form element to the form. It will be built out and * validated in the callback(s) listed in hook_elements. We build it * out in the callbacks rather than here in hook_widget so it can be * plugged into any module that can provide it with valid * $field information. * * Content module will set the weight, field name and delta values * for each form element. This is a change from earlier CCK versions * where the widget managed its own multiple values. * * If there are multiple values for this field, the content module will * call this function as many times as needed. * * @param $form * the entire form array, $form['#node'] holds node information * @param $form_state * the form_state, $form_state['values'][$field['field_name']] * holds the field's form values. * @param $field * the field array * @param $items * array of default values for this field * @param $delta * the order of this item in the array of subelements (0, 1, 2, etc) * * @return * the form item for a single element for this field */ function politicas_proyectos_widget(&$form, &$form_state, $field, $items, $delta = 0) { switch ($field['widget']['type']) { case 'politicas_direccionales_select': $element = array( '#type' => 'politicas_direccionales_select', '#default_value' => $items, ); break; } return $element; } /** * Implementation of FAPI hook_elements(). * * Any FAPI callbacks needed for individual widgets can be declared here, * and the element will be passed to those callbacks for processing. * * Drupal will automatically theme the element using a theme with * the same name as the hook_elements key. * * Autocomplete_path is not used by text_widget but other widgets can use it * (see nodereference and userreference). */ function politicas_proyectos_elements() { return array( 'politicas_direccionales_select' => array( '#input' => TRUE, '#columns' => array('uid'), '#delta' => 0, '#process' => array('politicas_direccionales_select_process'), ), ); } /** * FAPI theme for an individual elements. * * The textfield or select is already rendered by the * textfield or select themes and the html output * lives in $element['#children']. Override this theme to * make custom changes to the output. * * $element['#field_name'] contains the field name * $element['#delta] is the position of this element in the group */ function theme_politicas_direccionales_select($element) { return $element['#children']; } /** * Process an individual element. * * Build the form element. When creating a form using FAPI #process, * note that $element['#value'] is already set. * * The $fields array is in $form['#field_info'][$element['#field_name']]. */ function politicas_direccionales_select_process($element, $edit, $form_state, $form) { global $user; $field_name = $element['#field_name']; $field = $form['#field_info'][$field_name]; $field_key = $element['#columns'][0]; $default = isset($element['#value'][$field_key]) ? $element['#value'][$field_key] : $form['#politica']; $options = array(); if (!isset($form['#politicas']['politicas']) && count($form['#politicas']['politicas'])) { $sa = isset($form['#field_info'][$element['#field_name']]['widget']['situacion_actual']) ? $form['#field_info'][$element['#field_name']]['widget']['situacion_actual'] : 0; // The nodereference_select widget doesn't need to create its own // element, it can wrap around the optionwidgets_select element. // This will create a new, nested instance of the field. // Add a validation step where the value can be unwrapped. $ente_nid = isset($form['#ente_planificador']) && isset($form['#ente_planificador']->nid) ? $form['#ente_planificador']->nid : 0; if (!$ente_nid) { $ente = usuario_tiene_ente($user->uid); $ente_nid = $ente->nid; } $field_key = $element['#columns'][0]; $politicas = _politicas_proyectos_references($ente_nid, $sa); $options = $politicas['politicas']; } else { $options = $form['#politicas']['politicas']; } $element[$field_key] = array( '#type' => 'select', '#title' => $element['#title'], '#description' => $element['#description'], '#required' => isset($element['#required']) ? $element['#required'] : $field['required'], '#multiple' => isset($element['#multiple']) ? $element['#multiple'] : $field['multiple'], '#options' => $options, '#default_value' => $default, '#entes' => $options['entes'], ); if (isset($form['#politica'])) { $display = $form['#politica'] && count($form['#all_descriptores'])? _politicas_proyectos_display_politicas($form['#all_descriptores'], $form['#formas_solucion']) : t('No ha seleccionado una politica'); if (!is_array($form['#politicas']['politicas']) || !count($form['#politicas']['politicas'])){ $element[$field_key]['#prefix'] = '
' . t('El ente planificador aún no posee Políticas Direccionales.') . '
'; } $element[$field_key]['#suffix'] = '
' . $display . '
'; $element[$field_key]['#ahah'] = array( 'event' => 'change', 'path' => 'politicas_proyectos_get_politicas_js', 'wrapper' => 'proyecto-operativo-' . $field_key, 'method' => 'replace', 'progress' => array('type' => 'bar', 'message' => t('Please wait...')), ); } if (empty($element[$field_key]['#element_validate'])) { $element[$field_key]['#element_validate'] = array(); } array_unshift($element[$field_key]['#element_validate'], 'nodereference_optionwidgets_validate'); return $element; } /** * Implementation of _politicas_direccionales_references(). */ function _politicas_proyectos_references($ente_id = 0, $sa = 0) { static $results = array(); if (!$results[$ente_id]) { $fathers = _ente_planificador_hierarchical_get_desc($ente_id, 1); if ($sa) { $planns = _situacion_actual_preliminar_get_planns(); $plan = $planns['situacion_actual']; } $inputs = array(); $implode_sql = array(); $max_level = 0; foreach($fathers as $ente){ if ($max_level < $ente['level']) { $max_level = $ente['level']; } if (!$sa) { $implode_sql[] = '%d'; $inputs[] = $ente['nid']; } elseif (isset($plan['ente_type'][$ente['level']])) { $implode_sql[] = '%d'; $inputs[] = $ente['nid']; } } //si el propio ente tiene politicas if (isset($plan['ente_type'][$max_level + 1])) { $implode_sql[] = '%d'; $inputs[] = $ente_id; } $sql = 'SELECT n.nid, nr.body, pd.field_politicas_ente_nid FROM {content_type_politicas_direccionales} AS pd INNER JOIN {node} AS n ON n.nid = pd.nid AND n.vid = pd.vid INNER JOIN {node_revisions} AS nr ON n.nid = nr.nid AND n.vid = nr.vid WHERE'; if (count($implode_sql)) { $sql .= ' pd.field_politicas_ente_nid IN (' . implode (', ', $implode_sql) . ') AND'; } $sql .= ' field_politicas_direcc_year_value = %d AND field_politicas_seleccionada_value = %d'; $inputs[] = variable_get('situacional_actual_preliminar_anho_creacion', 0); $inputs[] = 1; $result = db_query($sql, $inputs); $results[$field['#ente_id']] = array(); while($politica = db_fetch_object($result)) { $results[$ente_id]['politicas'][$politica->nid] = $politica->body; $results[$ente_id]['entes'][$politica->field_politicas_ente_nid] = $politica->field_politicas_ente_nid; } } return $results[$ente_id]; }