wiki:WF/Criacaodenovasinstancias

Version 7 (modified by viani, 14 years ago) (diff)

--

Criação de Novas Instâncias a Partir de Standalones / Outras Instâncias

Através de modificações feitas na engine do Workflow, foi disponibilizada a possibilidade de criar novas instâncias a partir de uma outra instância ou a partir de atividades standalone.

A criação destas instâncias tem como base a simulação da ação do usuário em uma atividade start.

Por exemplo, supondo que para finalizar a atividade "Compor Solicitação", do tipo start, o usuário precise fornecer um título e uma descrição para a solicitação e executar a ação "Enviar". O código abaixo representa dois métodos da model da atividade "Compor Solicitação":

function validar()
{
	$erros = array();
	if (empty($this->_titulo))
		$erros[] = "Insira um título";
	if (empty($this->_descricao))
		$erros[] = "Insira uma descrição";
	return $erros;
}

function enviarAction()
{
	if (count($this->activity->error = $this->validar()) == 0)
	{
		/* salva os dados e
		finaliza a instância */
	}
	else
		return false;
}

Neste caso se quisermos, a partir de uma standalone, criar instâncias com base na atividade start "Compor Solicitação", devemos simular a ação do usuário no ato de composição de solicitação. Isto pode ser feito da seguinte forma (para o caso citado), na model.

$_REQUEST['action'] = 'enviar';
$_REQUEST['_titulo'] = 'meu título';
$_REQUEST['_descricao'] = 'minha descrição';

A chamada que faz a simulação para a atividade "Compor Solicitação", pode ser vista abaixo (chamada na model):

$this->instance->createChildInstance('Compor Solicitação');

Assim sendo, o código completo que coloca os dados desejados e simula a ação "Enviar" da atividade "Compor Solicitação" fica assim:

$_REQUEST['action'] = 'enviar';
$_REQUEST['_titulo'] = 'meu título';
$_REQUEST['_descricao'] = 'minha descrição';

$this->instance->createChildInstance('Compor Solicitação');

Também é possível fazer um loop para a criação de várias instâncias. Por exemplo:

function criarAction()
{
        $_REQUEST['action'] = 'enviar';
        for ($i = 0; $i < 3; $i++)
        {
            $_REQUEST['_titulo'] = 'meu título: ' . date("H\hi\ms\s");
            $_REQUEST['_descricao'] = 'descrição';
            $this->instance->createChildInstance('Compor Solicitação');
        }
}

Parâmetros Adicionais na Assinatura do método createChildInstance

Nos exemplos anteriores foram feitas chamadas ao método usando o único parâmetro obrigatório que é o nome da atividade tipo Start a ser usada para criar a instância. Mas é possível passar outros parâmetros, conforme está descrito nos comentários phpdoc do método:

int createChildInstance (string $activityName, [mixed $properties = false], [mixed $user = '*'], [bool $parentLock = true])

    * string $activityName: The name of the activity of the new instance
    * mixed $properties: Determines the new instance properties.
      If "true" the properties of the current instance will be inherited by the new instance.
      If "false" no properties will be set.
      If an "array" (format: property_name => property_value) every property defined in that array will be available to the new instance.
      False by default
    * mixed $user: The ID of the user who will own the new instance or '*' (i.e., everyone). '*' by default
    * bool $parentLock: Flag that determines if the parent instance MUST wait for it's children completion before it's own completion ("true") or not ("false"). "true" by default.

Caso a instância filha seja criada a partir de uma instância válida, ficará registrado um relacionamento entre elas que pode ser recuperado através da classe wf_instance, com o método getChildren.

Por outro lado, caso não exista uma instância válida, como no caso do createChildInstance ser invocado em uma atividade standalone, o relacionamento não será criado e a nova instância será independente.