entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

KoolTreeView

Alguno de vosotros ha usado esta herramienta? Estamos creando una "Intranet Web" donde con una interfaz gráfica muy amigable tengan acceso todos los trabajadores a documentación, páginas web, contactos, etc. de la empresa. Por el momento funciona de la siguiente manera:

  • En la base de datos se almacena cada uno de los elementos del menú con un campo "ruta" que almacena la ruta a la que debe dirigir ese elemento, si es una carpeta en la intranet se guarda de forma Administration/Company Documents por ejemplo. Luego KoolTreeView accede a dicha carpeta y, en código, lista todos los archivos dándole a cada uno supuestamente la opción de hacer click y cargar ese archivo.

  • KoolTreeView monta el árbol de archivos y dependiendo del tipo de dato (4 para URL web por ejemplo) construye los vínculos de la siguiente manera:

foreach($files as $ind_file)
{
    if (($ind_file!='..') && ($ind_file!='.') && (substr($ind_file,0,1)!='~') && (substr($ind_file,0,5)!='Thumb'))
    {
        $node=$treeviewsub->Add('root',$ind_file,"<span class='menuitem' onclick='toggle(this)'>".substr($ind_file,0,strlen($ind_file)-4)."/span>",false,substr($ind_file,-3).'.gif',"");
        $node->addData("url",rawurlencode ($dir."/".$ind_file));
        $node->addData("type",'2');
    }
}

El tema es que no funciona correctamente no sé por qué, la verdad es la siguiente, he leído y releído el código y no tengo ni idea por qué el elemento tiene la función onclick='toggle(this)'; no tengo ni idea de para qué vale... la copio aquí por si os vale de referencia.

function toggle(obj)
{
    var node = treeview.getNode(obj.parentNode.parentNode.parentNode.id);         
    if(node.isExpanded())
        node.collapse();
    else
        node.expand();
} 

Si tenéis alguna otra idea de cómo hacer lo que necesito también será bienvenida. La base de datos está ya construída.

Un saludo y gracias

0voto

ankeorum comentado

Si algún admin me pone el código del "foreach" como código que a mi no me valió...

0voto

carlossevi comentado

No funciona correctamente, pero ¿qué es lo que no funciona? ¿no pinta el arbol? ¿no tiene datos? ¿has trazado algo el código para saber si llega a entrar en el foreach?

La función onclick='toggle(this)'; lo que hace es expandir y contraer los nodos del árbol cuando se hace click sobre el ellos (elementos <span>). Nodebería afectar a que se muestre el árbol.

Te recomiendo seguir la documentación de KookTreeView y ver si sigues todos los pasos, ya que nosotros no podemos hacerlo porque el fragmento de código que compartes es muy pequeño.

0voto

ankeorum comentado

@carlossevi el árbol se muestra correctamente, el problema surge al listar un directorio, los archivos que lista usando el foreach que he puesto (en el que sí entra porque pinta los archivos en pantalla) no se pueden abrir. He intentado usar file:/// y la ruta, ponerlo como un vínculo y nada...

0voto

ankeorum comentado

Si no sabéis como va y podéis proponerme alguna otra opción para hacer lo que necesito sería genial.

Un saludo

0voto

carlossevi comentado

Si el código HTML que genera es:

<span class='menuitem' onclick='toggle(this)'>Ruta_documento</span>

¿Cómo quieres que se habra? Tendrás que ponerle algún enlace a una ruta que habra el archivo. ¿Cómo has probado a poner el file:///? Supongo que si has puesto un enlace a una ruta local del servidor, esa ruta no es accesible por el ordenador que carga la página HTML.

0voto

white comentado

pregunto lo mismo que @carlossevi como estas intentando abrir los ficheros?

En varios navegadores por seguridad no hay como abrir un fichero con protocolo file:// como ruta cuando los listas desde un protocolo http://.

ejemplos de una alternativa en firefox:

https://addons.mozilla.org/en-US/firefox/addon/locallink/

sería bueno también que pudieras decirnos si al archivo que estas intentando acceder esta alojado en el computador desde el que deseas acceder o esta en otro de tu intranet ( host ).

0voto

ankeorum comentado

Parece que mi explicación del problema no ha sido clara del todo, voy a intentar explicarla mejor.

La página que tenemos, llamémosla "intranet" muestra un kooltreeview con diferentes secciones y apartados, hay secciones que son directamente links a otras web, otras son carpetas en un disco duro de un servidor mapeado en todas las máquinas de la empresa (y también en el servidor mediante este método)

Mapeo de unidad en servidor usando misma letra que en todas las máquinas:

// Define the parameters for the shell command
    $location = "\\\\192.168.1.193\\Intranet";
    $user = "LAN\\Administrator";
    $pass = "swappw5";
    $letter = "I";

    //Map the drive
    system("net use ".$letter.": \"".$location."\" ".$pass." /user:".$user." /persistent:no>nul 2>&1");

Luego de eso conectamos a una base de datos en la cual tenemos los datos de todos los apartados que tiene el kooltreeview. La conexión es esta:

   $dbusername = "user";    
    $password = "password";
    $hostname = "host";
    $database = "db";

    $conninfo = Array("Database"=>"".$database."","UID"=>"".$dbusername."","PWD"=>"".$password."");
    $dbh = sqlsrv_connect($hostname, $conninfo) or die("Could not select database");

Bien, una vez ahí para montar el kooltreeview vamos haciendo una consulta a la base de datos a la tabla de menu (tblmenu) con diferentes KeyID dependiendo si es una raiz del árbol o es un apéndice. Esa consulta es la siguiente:

$KeyID = 'root';
function getchilds($KeyID,&$treeview)
{
    global $dbh;

    $result = sqlsrv_query($dbh,"SELECT * FROM tblmenu WHERE Parent='".$KeyID."' ORDER BY ordering,gTitle") or die("Error");
    while($row = sqlsrv_fetch_array($result))
    {
        $show_menu = 1;

        if (($row{'myKey'} == 'apprev_accounts') || ($row{'myKey'} == 'board_papers') || ($row{'myKey'} == 'eq_banking') || ($row{'myKey'} == 'annual_reports'))
        {
            if (($_COOKIE['mplcuser'] != 'jyoung') && 
                ($_COOKIE['mplcuser'] != 'Steve Ellis') && 
                ($_COOKIE['mplcuser'] != 'jayne banyard') && 
                ($_COOKIE['mplcuser'] != 'gonzalo lopez') && 
                ($_COOKIE['mplcuser'] != 'matthew sawyer') && 
                ($_COOKIE['mplcuser'] != 'mandy young'))
            {
                $show_menu = 0;
            }
        }

        if ($show_menu == 1)
        {

            $node=$treeview->Add($row{'Parent'},$row{'myKey'},"<span class='menuitem' onclick='toggle(this)'>".$row{'gTitle'}."</span>",$row{'Expand'},$row{'icon'},"");
            $node->addData("url",urldecode($row{'URL'}));
            $node->addData("type",$row{'Link_Type'});
            getchilds($row{'myKey'},$treeview);
        }

    }
}
getchilds($KeyID,$treeview);

$node=$treeview->Add('root','expand_all','Expand All',false,'triangle_blueS.gif',"");
$node->addData("url",'expand');

Esa consulta va formado los diferentes "node" del árbol. Para luego dibujarlo con una función render().

Bien, eso lo hace correctamente, el problema viene cuando, una vez dibujado el árbol, hacemos click en una carpeta. Por ejemplo, nuestro árbol dibuja directorios de nuestro disco duro "intranet" que es el que antes comentaba que estaba mapeado en todas las máquinas. Eso lo hace bien, el problema es que cuando lista los archivos dentro de ese directorio puedes hacer click en ellos pero te lleva a una página "_blank" en vez de al archivo en sí. Me daría igual que lo abriera en el navegador o que lo descargara.

El código que se utiliza para hacer el listado de archivos dentro de un directorio es el siguiente:

<div id="textarea">

<?PHP

        $result2 = sqlsrv_query($dbh,"SELECT comments, URL, gTitle, icon FROM tblmenu WHERE myKey='".$_GET['myID']."'");
        while($row2 = sqlsrv_fetch_array($result2))
        {

            $myTitle = $row2{'gTitle'};
            $myURL = "I:\\".$row2{'URL'};
            $myComments = $row2{'comments'};
            $myIcon = $row2{'icon'};

        }
        echo    "<h2>".$myTitle."</h2>";
        echo    "<p>".$myComments."</p><p></p>";
        //require "kooltreeview/kooltreeview.php";

        $treeviewsub = new KoolTreeView("treeviewsub");
        $treeviewsub->imageFolder="kooltreeview/icons";
        $treeviewsub->styleFolder="kooltreeview/styles/default";        
        $treeviewsub->showLines=true;
        $treeviewsub->selectEnable = true;
        $treeviewsub->multipleSelectEnable = false;

        $root = $treeviewsub->getRootNode();
        $root->text = $myTitle;
        $root->expand=true;
        $root->image= $myIcon;
        $root->showPlusMinus = false;
        $root->addData("type",1);

        $dir = $myURL;
        $dir = str_replace("/","\\",$dir);
        $files = scandir($dir);
        foreach($files as $ind_file)
        {
            if (($ind_file!='..') && ($ind_file!='.') && (substr($ind_file,0,1)!='~') && (substr($ind_file,0,5)!='Thumb'))
            {
                $node=$treeviewsub->Add('root',$ind_file,"<span class='menuitem' onclick='toggle(this)'>".substr($ind_file,0,strlen($ind_file)-4)."</span>",false,substr($ind_file,-3).'.gif',"");
                $node->addData("url",rawurlencode ($dir."/".$ind_file));
                $node->addData("type",'2');
            }
        }

        //$treeviewsub->width="230px";

        echo $treeviewsub->Render();
      ?>
      <script>

        treeviewsub.registerEvent("OnSelect",nodeSelect_handle);
      </script>
      <p></p>
      <p></p>
      </div>

Siento tanta literatura, a lo mejor hay cosas innecesarias pero quería que quedara lo más clara posible la pregunta ya que tantas dudas estaba generando la misma...

Un saludo y muchas gracias de antemano

0voto

white comentado

dame un ejemplo de que es lo que te imprime esta linea rawurlencode ($dir."/".$ind_file)

en windows el esquema para unidades es de 3 slashes file:///I:/Intranet/folder/archivo.docx

http://en.wikipedia.org/wiki/File_URI_scheme

pero no descarto la posibilidad de que el navegador sea el culpable de todo esto. puedes acceder al archivo desde el explorador de archivos sin ningun problema?

0voto

ankeorum comentado

Ya sé que son tres ///, lo he intentado forzando la ruta desde el código a file:///I:\Administration\Archivo.doc y no vale.

Lo que imprime la línea rawurlencode es:

<input id="Juan Valdes.pdf_data" type="hidden" value="{"url":"","data":{"url":"I%253A%255CCompliance%255CComplaints%252Fjuan%2520valdes.pdf","type":"2"}}">

0voto

white comentado

no has respondido mi pregunta, puedes acceder al archivo directamente desde tu explorador de windows?

I:\Compliance\Complaints/Jacqueline Trinder.pdf

puedes acceder al archivo pegando en una nueva pestaña de tu navegador esto:

file:///I:/Compliance/Complaints/Jacqueline Trinder.pdf

PD: que codigo tiene la funcion nodeSelect_handle del lado del cliente?

0voto

ankeorum comentado

La respuesta a esas dos preguntas es sí. La función nodeSelect_handle del lado del cliente no sé qué código tiene. No sé como responderte a esa pregunta.

0voto

white comentado

Ahora que sé que el archivo si es accesible estoy seguro que el navegador por seguridad no te deja abrir los enlaces con protocolo file://

tienes como opciones cambiar la forma en que se descargan los archivos, como por ejemplo subir estos al servidor principal, o puedes deshabilitar la seguridad de los navegadores, podrias intentar con una extension?

https://addons.mozilla.org/es/firefox/addon/locallink/
https://chrome.google.com/webstore/detail/locallinks/jllpkdkcdjndhggodimiphkghogcpida.

PD: ya que no conozco que hace nodeSelect_handle no se si con esa funcion te da la opcion de dar click con la url de los archivos o es otra funcion, pero asegurate de que este escapando correctamente la url, fijate que
I%253A%255CCompliance%255CComplaints%252Fjuan%2520valdes.pdf esta escapada dos veces.

0voto

ankeorum comentado

He instalado un plugin para chrome para lo de abrir archivos locales a ver qué pasa. Mira te copio el código generado en el cliente para cuando lista un archivo cualquiera:

<li id='09.doc' class='ktvLI'><div class='ktvMid'><img src='kooltreeview/icons/doc.gif' class='ktvImage' alt=''/><span class='ktvText'><span class='menuitem' onclick='toggle(this)'>09</span></span><input id='09.doc_data' type='hidden' value='{"url":"","data":{"url":"I%253A%255CCompliance%255CAudit%252Fxxx%2520and%2520yyy%252F09%2520-%2520Brit%2520Audit.doc","type":"2"}}'/></div></li>

Ese es el código que me genera para los ficheros cuando los muestra... al hacer click no hace absolutamente nada.

0voto

white comentado

TIenes registrado un evento, treeviewsub.registerEvent("OnSelect",nodeSelect_handle);
mientras no sepa que codigo contiene, no puedo saber como abre los enlaces y si lo hace correctamente. supongo que obtiene la url del archivo de esta forma: kTree.getNode(elemento.NodeId).getData("url")

por que no intentas agregando un enlace en lugar de un span?

$node=$treeviewsub->Add('root',$ind_file,"<a class='menuitem' href='file:///".urldecode($dir."/".$ind_file)."'>".substr($ind_file,0,strlen($ind_file)-4)."</a>",false,substr($ind_file,-3).'.gif',"");

0voto

ankeorum comentado

Como puedo saber si eso ocurre así como comentas?

Haciendo una búsqueda de getNode en todo el sitio local he encontrado esto:

function nodeSelect_handle(sender,arg){
var treenode = treeview.getNode(arg.NodeId);
var url = treenode.getData("url");  
var type = treenode.getData("type");
var myid = arg.NodeId;

function toggle(obj)
{
    var node = treeview.getNode(obj.parentNode.parentNode.parentNode.id);         
    if(node.isExpanded())
        node.collapse();
    else
        node.expand();
} 

Y por último esta parrafada que no la comprendo ni lo más mínimo jejjeej

getNode:function (_bi7){return new _bi1(_bi7); } ,expandAll:function (){if (_bZ())return this ; var _blj=_bA(this._ba+".root"); var _bij=_blj.getElementsByTagName("ul"); for (var i=0; i<_bij.length; i++)if (_bS(_bij[i]).indexOf("ktvUL")>-1){_bl(_bij[i],1); var _bi4=_bU(_bE(_bij[i])); var _bl9=_bL(_bi4,"ktvPM"); _bN("Plus","Minus",_bl9); }return this ; }

A ver si algo de eso te vale porque estoy ya desesperado con este problema. :_(

0voto

white comentado

prueba lo que te propuse, cambia el <span> por un elemento <a> e instala el plugin de chrome o firefox, luego me cuentas.

0voto

ankeorum comentado

Haciendo eso los archivos se convierten en vínculos con este código:

localexplorer:I:\Compliance\Audit\01 - Baker Tilly Leter Letter - 22-03-07.doc

Lo cual tampoco funciona, por qué está sustituyendo file:/// por localexplorer:? No lo entiendo

0voto

white comentado

Estas seguro que instalaste el plugin correcto en chrome? https://chrome.google.com/webstore/detail/locallinks/jllpkdkcdjndhggodimiphkghogcpida
por que no intentas tambien con firefox?

Puedes abrir un nuevo tema si sigues teniendo problemas, el problema actual parece ser diferente al original.

saludos!

0voto

ankeorum comentado

La extensión está instalada el problema es que a pesar de yo haber creado el a href con la forma file:/// cuando el navegador lo muestra muestra eso de localexplorer: que es lo que hace que no valga creo...

0voto

white comentado

posibles causas:

1: un plugin de chrome
2: un script que esta actuando de intermediario editando el atributo href

me voy mas a que es lo primero, desinstala el o los plugins en chrome, tambien prueba con firefox!, arriba te mencione que lo pruebes con firefox,

¿no funcionó? puedes abrir una nueva pregunta para evitar el offtopic en esta.

saludos!

0voto

ankeorum comentado

En firefox el a href se muestra correctamente como pongo a continuación:

file:///I:\Approved Documents\Admin Templates/Template.docx

Pero al hacer click igualmente no se abre... Quizás tenga la culpa esto?

if (url.substring(url.length,url.length-3) == "pdf2")
            {
                location.href = 'get_resolution.php?Path=' + url;
            }
            else
            {
                ggg = 'documents/' + url;
                //location.href = 'file://mplc05/intranet_docs/' + url;
                //alert(decodeURIComponent(url));

                window.open('file:///' + decodeURIComponent(url),'mywindow');
            }

Porque si quito el comentario de la "alert" se muestra la ruta de red...

1 Respuesta

1voto

white Puntos75880

1.- cambiar tu elemento <span> por <a>

$node=$treeviewsub->Add('root',$ind_file,"<a class='menuitem' href='file:///".urldecode($dir."/".$ind_file)."'>".substr($ind_file,0,strlen($ind_file)-4)."</a>",false,substr($ind_file,-3).'.gif',"");

metodo 1

2.- Instalar el plugin firefox https://addons.mozilla.org/es/firefox/addon/locallink/

3.- marcar como comentario el codigo que tienes:

/*if (url.substring(url.length,url.length-3) == "pdf2")
{
    location.href = 'get_resolution.php?Path=' + url;
}
else
{
    ggg = 'documents/' + url;
    //location.href = 'file://mplc05/intranet_docs/' + url;
    //alert(decodeURIComponent(url));

    window.open('file:///' + decodeURIComponent(url),'mywindow');
}*/

4.- dar click derecho al enlace file:/// click en open link in local context seleccionar in this tab

metodo 2

2.- abrir la direccion: %appdata%\Mozilla\Firefox\Profiles[identificador].default\
[identificador] es un identificar, buscar la carpeta dentro de: %appdata%\Mozilla\Firefox\Profiles\

3.- crear un archivo llamado user.js

4.- agregar el siguiente contenido:

user_pref("capability.policy.policynames", "localfilelinks");
user_pref("capability.policy.localfilelinks.sites", "<tu sitio>");
user_pref("capability.policy.localfilelinks.checkloaduri.enabled", "allAccess");

5.- reemplazar <tu sitio> por la url de tu servidor ( ejemplo: http://localhost )

6.- reiniciar firefox


Sugerencia: Por seguridad navegadores modernos no permiten abrir enlaces con protocolo file:///, la mejor solucion es crear un servidor ftp para tu intranet o subir los archivos al servidor principal.

0voto

ankeorum comentado

Esta es la mejor respuesta después de llevar una semana liado con esto y de estar muchas horas buscando información en internet pero sigue sin funcionar. Cuando hago eso en firefox muestra una página de error que dice lo siguiente:

Archivo no encontrado

Firefox no puede encontrar el archivo en /I:/Approved Documents/Admin
Templates/Lever Arch Labels.doc.

Compruebe que el nombre de archivo no tiene errores de escritura, incluyendo el uso de mayúsculas.
Compruebe si el archivo ha sido movido, renombrado o eliminado.

Marcaré como mejor respuesta pero no hemos solucionado el problema que tenía :-(

0voto

white comentado

intenta con este codigo:

$path_file = str_replace('\\', '/', urldecode($dir."/".$ind_file));
$node=$treeviewsub->Add('root',$ind_file,"<a class='menuitem' href='file:///".$path_file."'>".substr($ind_file,0,strlen($ind_file)-4)."</a>",false,substr($ind_file,-3).'.gif',"");

con eso bastaría.

PD: cersiorate de que exista el archivo I:/Approved Documents/Admin Templates/Lever Arch Labels.doc

0voto

ankeorum comentado

No funciona :(, sigue haciendo lo mismo

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta