Conectado como invitado | [ Registrarse | Entrar ] Buscar | Contacto
INICIO | NOTICIAS 22 May, 2012 - 05:57

SugarCRM

Tutoriales

Colabora

Menú Principal

Entrar en Tu Cuenta




 


 ¿Has perdido tu contraseña?
 ¿Nuevo usuario? ¡Registrate!



Buscar Ultimos mensajes Nota: Los usuarios registrados pueden participar en el foro activamente, subscribirse a foros o temas, recibir notificaciones sobre nuevos mensajes y mucho más... Nota: Los usuarios registrados pueden participar en el foro activamente, subscribirse a foros o temas, recibir notificaciones sobre nuevos mensajes y mucho más...

Ir a la pagina : 1 | 2 Pagina siguiente
ayuda con logic hooks
Autor Mensaje
Bajar a respuesta rápidaTop
 
Saludos.
Tengo un campo “Lista Desplegable” con dos estados, Activo e Inactivo, en el modulo de “Proyectos”, y el modulo de proyectos lo he relacionado con el modulo el modulo de “Cuentas” Una relación de uno a muchos, una Cuenta puede tener muchos Poryectos.
Ahora requiero realizar una actualizacion de un campo en el modulo “Cuentas”, dependiendo de si existen proyectos relacionados con estado Activo o Inactivo, o sea si existe por lo menos un proyecto relacionado en estado activo pues el campo en “cuentas” se debe actualizar a “activo” caso contrario “Inactivo”. Entiendo que esto se puede realizr por medo de Logics Hooks, por lo cual el dia de hoy he iniciado con este tema, por el momento solo quiero ver que me actualice un campo en X modulo, asignándole Y valor, la lógica de si existen Proyectos en tal o cual estado no la he abordado aun. Pero aun realizando lo que seria de menor complejidad no me funciona.

Esta es la especificación d elo que he realizado para el Logics Hooks:
-primero he creado dos campos en cada modulo, en “Proyecto” el campo “estados_c” una lista desplegable con valores (activo,inactivo,terminado). En “Cuenta” he creado el campo “estado_cuenta_c” a falta de un tipo de campo etiqueta, es un campo de texto, que despues desabhilitaria, para que solo tome el estado del Logics Hooks.
En el directorio de “proyecto”
Carpeta de publicacion\SugarCRM\custom\modules\Project
He creado el archivo logic_hooks.php el cual no existía, y tiene lo siguiente.

<?php

$hook_version = 1;



$hook_array['before_save'][] = Array(1, 'cambiar_estado', 'custom/modules/Project/Project_Hook.php','Project_Hook', 'cambiar_estado');



?>



Y el archivo con la función Project_Hook.php.

<?

require_once("../../../data/SugarBean.php");

if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');

class Project_Hook {

function cambiar_estado(&$bean, $event, $arguments)
{

$bean->estado_cuenta_c = $bean->estados_c;


}

}
?>

Tengo dos preguntas, la primera es en relación a un error que muestra el siguiente error:

Warning: require_once(../../../data/SugarBean.php) [function.require-once]: failed to open stream: No such file or directory in C:\AppServ\www\SugarCRM\custom\modules\Project\Project_Hook.php on line 3

Fatal error: require_once() [function.require]: Failed opening required '../../../data/SugarBean.php' (include_path='C:\AppServ\www\SugarCRM\include/..;.;C:\php5\pear') in C:\AppServ\www\SugarCRM\custom\modules\Project\Project_Hook.php on line 3

Ahora no entiendo porque me muestra este error que no encuentra el SugarBeam.php si esta bien, si me encuentro en el directorio .
C:\AppServ\www\SugarCRM\custom\modules\Project
Y SugarBean.php se encuentra en.
C:\AppServ\www\SugarCRM\data\SugarBean.php
Para alcanzarlo seria correcto. No entiendo ele error.
require_once("../../../data/SugarBean.php");

La segunda pregunta es si la implementación del logic_hooks es correcta. Gracias.
Code
    <li style="color: blue; font-weight: bold;">
     






editado por: andres22, 12 Ene, 2011 - 12:25

Perfil del usuario Enviar MP
Bajar a respuesta rápidaTop
 
Hola andres22, la falla que estás teniendo es porque siempre trabajas en el index.php que se encuentra en la raíz de la instancia de SugarCRM, por ejemplo, para crear una Cuenta, fijate que la URL es la siguiente: http://SERIDOR/sugarcrm/index.php?module=Accounts&action=EditView, lo que va cambiando es el action y el module, por lo que si quieres hacer un require de tu archivo, debes hacer: require_once("data/SugarBean.php");

Por otro lado, no necesitas hacer un include de ese archivo para trabajar en logic_hooks, ya que el bean fue creado, instanciado y hasta completado sus valores.

La implementación es correcta del código, lo que te sugiero que puedes hacer, en la función cambiar_estado es hacer un die("Pasa por aqui"); Si ves el mensaje al guardar un registro, es porque funciona Ok, de lo contrario, consulta la developer guide de tu versión de SugarCRM.

Saludos,

Cualquier inquietud, no dejes de contactarme.
Saludos,

Esteban Schmirman
GrowIT - SugarCRM
* Gold Partners *

Buenos Aires, Arg
+54(11) 4856-7780

Santiago, Chile
+56 (2) 495-7314

Skype: eschmirman

Perfil del usuario Enviar MP
Bajar a respuesta rápidaTop
 
Amigo efectivamente eso era, ya no me muestra error.

Pero al crear un nuevo "proyecto" con un estado del campo desplegable y asociarlo a una "cuenta" existente, no se evidencia la actualización del campo en "cuentas", al revisar por debajo su valor es Null, o sea el logic_hook no esta haciendo nada.
Tampoco veo el mensaje. En que momento se supone que se ejecuta lo que se encuentra en la funcion, porque yo simplemente estoy creando un nuevo proyecto y le doy un estado, y al guardar el proyecto esperaria que se actualice el campo en "cuenta"... o no funciona de esa manera?

Al final he dejado el Project_Hook.php como va.




<?

require_once('data/SugarBean.php');

if(!defined('sugarEntry') || !sugarEntry) die('Pasa por aqui');

class Project_Hook {

function cambiar_estado(&$bean, $event, $arguments)
{

$bean->estado_cuenta_c = $bean->estados_c;


}

}
?>






Estos serian los campos que he creado,

http://img39.imageshack.us/img39/2482/dibujo1mg.jpg


http://img213.imageshack.us/img213/577/dibujo2qs.jpg



Esta asignación es correcta entonces???

$bean->estado_cuenta_c = $bean->estados_c;

Que faltaría, mi versión del Sugar es la 6.0.0. Gracias.




editado por: andres22, 12 Ene, 2011 - 03:29

Perfil del usuario Enviar MP
Bajar a respuesta rápidaTop
 
Andres, aclaremos un poco la situación:
En la definición del Logic Hook: $hook_array['before_save'][] estás declarando que se ejecute antes de guardar el registro, lo cual está bién.

Por otro lado, el mensaje que te sugería que pongas para ver si está funcionando bién el logic_hook lo pusiste mal, ponelo así:

<?
if(!defined('sugarEntry') || !sugarEntry) die('Invalid Sugar EntryPoint');

class Project_Hook {
function cambiar_estado(&$bean, $event, $arguments)
{
//$bean->estado_cuenta_c = $bean->estados_c;
die("Entra en Logic_Hook");
}
}
?>

Ahora, con ese código, prueba si te funciona, en caso de que si, estás bien encaminado, de lo contrario, avisame.

Bién, supongamos que funciona el logic_hook y pasa por donde queremos que pase.
Tu objeto $bean contiene toda la información del registro que estás guardando, por lo que, navegando el objeto deberías encontrar el Id de la Cuenta que tiene relacionado.
Para ver cual es el campo que contiene dicho Id, puedes poner en tu función



Paso siguiente, una vez identificado el campo que contiene el Id de la Cuenta, es mostrarlo por pantalla, por lo que debes reemplazar:

print "
";
print_r($bean);
print "
";
die();

por

print "Cuenta Asociada al Proyecto: ".$bean->CAMPO_ACCOUNT_ID

Ahora bien, cuando llegues a este punto avisame y seguimos con el tutorial :D

Saludos,

Cualquier inquietud, no dejes de contactarme.
Saludos,

Esteban Schmirman
GrowIT - SugarCRM
* Gold Partners *

Buenos Aires, Arg
+54(11) 4856-7780

Santiago, Chile
+56 (2) 495-7314

Skype: eschmirman

Perfil del usuario Enviar MP
Bajar a respuesta rápidaTop
 
Gracias por tu ayuda en verdad. Efectivamente esta entrando, me muestra el mensaje. Estoy imprimiendo el objeto, pero bota toda la información. identifico el campo id de la cuenta como el siguiente.

[accounts_pef09ccounts_ida] => 7cd82d33-203b-1796-83a5-4d2db444daca

remplazo por

print "Cuenta Asociada al Proyecto: ".$bean->CAMPO_ACCOUNT_ID

por

print "Cuenta Asociada al Proyecto: ".$bean->accounts_pef09ccounts_ida;

y no pasa nada al ejecutar el logic_hook.

saludos.






editado por: andres22, 12 Ene, 2011 - 05:47

Perfil del usuario Enviar MP
Bajar a respuesta rápidaTop
 
Hola andres, prueba con el siguiente código dentro de tu función:

print "Cuenta Asociada al Proyecto: ".$bean->accounts_pef09ccounts_ida;
die();

Cualquier inquietud, no dejes de contactarme.
Saludos,

Esteban Schmirman
GrowIT - SugarCRM
* Gold Partners *

Buenos Aires, Arg
+54(11) 4856-7780

Santiago, Chile
+56 (2) 495-7314

Skype: eschmirman

Perfil del usuario Enviar MP
Bajar a respuesta rápidaTop
 
Ok amigo, ya l cambie y funciona, me muestra el ID de la cuenta a la cual asocio el proyecto. Cual seria el paso siguiente. Muchas Gracias por tu ayuda.

Perfil del usuario Enviar MP
Bajar a respuesta rápidaTop
 
Ok, paso siguiente es actualizar el campo de la Cuenta, que es el que indica que tiene proyectos o no.
Para eso vamos a utilizar la API que provee SugarCRM.

Dentro de tu Logic Hook:

if(!empty($bean->accounts_pef09ccounts_ida;)){
$myAccountTmp=new Account();
$myAccountTmp->retrieve($bean->accounts_pef09ccounts_ida);
$myAccountTmp->CAMPO_QUE_INDICA_ESTADO_CON_PROYECTO="TU_VALOR";
$myAccountTmp->save();
}

Pruebalo y contame como te fue.
Saludos,

Cualquier inquietud, no dejes de contactarme.
Saludos,

Esteban Schmirman
GrowIT - SugarCRM
* Gold Partners *

Buenos Aires, Arg
+54(11) 4856-7780

Santiago, Chile
+56 (2) 495-7314

Skype: eschmirman

Perfil del usuario Enviar MP
Bajar a respuesta rápidaTop
 
Muchas gracias, todo bien, ahora ya entiendo un poco mejor, y entonces voy a mirar el query para que me devuelva el valor a asignar dependiendo de si hay proyectos activos o no. Por cierto me podrias indicar como deshabilito el campo al cual le estoy asignando el valor, pues en ultimas es un campo d etexto y si se ingresa por el modulo de "Cuentas" se puede editar su valor. de nuevo Gracias.

Perfil del usuario Enviar MP
Bajar a respuesta rápidaTop
 
Hola Andres, me alegro que hayas solucionado tu tema.
Para deshabilitar un campo, en Comunity, te sugiero que lo saques de la vista de Edición desde el Estudio, de esa manera, vas a restringir su edición.
Saludos,


Cualquier inquietud, no dejes de contactarme.
Saludos,

Esteban Schmirman
GrowIT - SugarCRM
* Gold Partners *

Buenos Aires, Arg
+54(11) 4856-7780

Santiago, Chile
+56 (2) 495-7314

Skype: eschmirman

Perfil del usuario Enviar MP
Bajar a respuesta rápidaTop
 
Gracias, sos groso.

Perfil del usuario Enviar MP
Bajar a respuesta rápidaTop
 
Saludos, espero no ser muy molesto, pero ahora se me ha presentado un problema para trabajar con el resultado de un query en logic hook.

Quiero ejecutar un query, que devuelve un resultado que pueden ser varios registros. Entonces requiero conocer cuantos registros me devuelve la consulta, asi como el msql_NumRows() ,cual es el funcion al cual paso como parámetro el query y la fila como mysql_Fetch_Object(), para poder construir el objeto y obtener y asignar la columna que desee.
En el momento he intentado obtener la colmna de esta manera.


$db = DBManagerFactory::getInstance();
query=”select …”;
$resultado = $bean->db->query($query);
$fil = $bean->db->fetchByAssoc($resultado);
print $fil; die();

pero obtengo como resultado “Array”.

También intente.
$resultado = $db->query($query, true);
$fil = $db->fetchByAssoc($resultado));
print $fil ; die();


y de nuevo obtengo “Array” en lugar de un numero.

Imprimo el objeto $db pero no veo ningún atributo para el numero de columnas. Como puedo hacer lo que yo quiero, de nuevo Gracias.


Perfil del usuario Enviar MP
Bajar a respuesta rápidaTop
 
$db=DBManagerFactory::getInstance();
$query="select ... from ... where";
$rs=$db->query($query, true, 'Error searching myModule: ');
while($row = $db->fetchByAssoc($rs)){
}

En el objeto $db tienes todos los métodos disponibles...
Saludos,

Cualquier inquietud, no dejes de contactarme.
Saludos,

Esteban Schmirman
GrowIT - SugarCRM
* Gold Partners *

Buenos Aires, Arg
+54(11) 4856-7780

Santiago, Chile
+56 (2) 495-7314

Skype: eschmirman

Perfil del usuario Enviar MP
Bajar a respuesta rápidaTop
 
Gracias amigo, una pregunta, depsues de que entro a la iteración estoy realizando una sentencia lógica para saber si X atributo se encuentra en Y estado, y efectivamente esta entrando cuando se cumple, pero luego quiero asignar un valor a una variable con el código que habías colgado anteriormente, pero ahora con el evento $hook_array['after_save'][], entonces se supone que primero se aplican los cambios y luego se ejecuta el logic hook verdad.

Bueno entonces estoy haciendo esto:
$estado=’Inactivo’

while($row[$i] = $db->fetchByAssoc($rs)){


if($row[$i]['estados_c']=='activo'){

$estado='Activo';
}

$i++;
}

if(!empty($bean->accounts_pef09ccounts_ida)){
$myAccountTmp=new Account();
//$myAccountTmp->retrieve($bean->accounts_pef09ccounts_ida);
$myAccountTmp->estado_cuenta_c=$estado;
$myAccountTmp->save();}

Pero no me asigna el valor, como podría yo asignar al código que me pasaste antes un valor dependiendo de la sentencia lógica en la iteración d elos resultados del select. Ademas se trabaja igual con el evento $hook_array['after_save'][]. Gracias



Perfil del usuario Enviar MP
Bajar a respuesta rápidaTop
 
Fijate que la variable $i no está inicializada... En este caso no la necesitas.
La variable $row contiene indices según la columna de la query, es decir, si haces

select id, name en tu variable $row vas a tener $row['name'] y $row['id']
Te recomiendo que antes de mandarte a ejecutar codigo, pruebes primero si los resultados esta bien, es decir, puedes hacer lo siguiente:

while($row = $db->fetchByAssoc($rs)){
print "Fila: ";
print "
";
print_r($row);
print "
";
}
die();

Cualquier inquietud, no dejes de contactarme.
Saludos,

Esteban Schmirman
GrowIT - SugarCRM
* Gold Partners *

Buenos Aires, Arg
+54(11) 4856-7780

Santiago, Chile
+56 (2) 495-7314

Skype: eschmirman

Perfil del usuario Enviar MP
Ir a la pagina : 1 | 2 Pagina siguiente


Usuarios online:
Heedife - BigBobBofe y 0 invitado

Esta lista muestra los usuarios activos de los últimos 10 minutos