Gå till innehåll
Se i appen

Ett bättre sätt att surfa. Läs mer.

IC5 Översättningar

En helskärmsapp på din startskärm med push-notiser, märken och mer.

För att installera den här appen på iOS och iPadOS
  1. Tryck på Dela ikonen i Safari
  2. Bläddra i menyn och tryck på Lägg till på startskärmen.
  3. Tryck på Lägg till i det övre högra hörnet.
För att installera den här appen på Android
  1. Tryck på 3 punktsmenyn (⋮) i webbläsarens övre högra hörn.
  2. Tryck på Lägg till på startskärmen eller Installera appen.
  3. Bekräfta genom att trycka på Installera.

[4.7.22] Task::postComplete() fails because $data is NULL

Postad

I made a custom application with a Queue extension task for a client. Before calling it, I set a custom flag for a specific member, whose ID I also pass as the $data['member_id'] variable.

Then, in the postComplete() function, I reset the flag for the member once the task is done running:

	/**
	 * Perform post-completion processing
	 *
	 * @param	array	$data		Data returned from preQueueData
	 * @param	bool	$processed	Was anything processed or not? If preQueueData returns NULL, this will be FALSE.
	 * @return	void
	 */
	public function postComplete( $data, $processed = TRUE )
	{
		$data = json_decode( $data['data'], TRUE );
		
		# Once the task is complete update the member status to READY
		$member = Member::load( $data['member_id'] );
		$member->custom_flag_field = Suggestion::STATUS_READY;
		$member->save();
	}

The code above works just fine as long as there is any data to process for the member. However, when the member has nothing to parse, and preQueueData() returns NULL, the postComplete() function doesn't have any data on which member to reset the flag for.

The Task::queue() function should be updated to at least still pass the original $data variable values instead of NULL (or an empty array in v5). This is the current code:

		if ( method_exists( $extensions[ $key ], 'preQueueData' ) )
		{
			$class = new $extensions[ $key ];
			try
			{
				$data = $class->preQueueData( $data );
			}
			catch( \OutOfRangeException $e )
			{
				$data = NULL;
			}

			if ( $data === NULL )
			{
				if ( method_exists( $class, 'postComplete' ) )
				{
					$class->postComplete( $data, FALSE );
				}
				
				return;
			}
		}

Here's my suggested change:

		if ( method_exists( $extensions[ $key ], 'preQueueData' ) )
		{
			$class   = new $extensions[ $key ];
			$oldData = $data;
			try
			{
				$data = $class->preQueueData( $oldData );
			}
			catch( \OutOfRangeException $e )
			{
				$data = NULL;
			}

			if ( $data === NULL )
			{
				if ( method_exists( $class, 'postComplete' ) )
				{
					$class->postComplete( $oldData, FALSE );
				}
				
				return;
			}
		}

I store the original values in $oldData and pass that variable to both preQueueData() and postComplete().

If $data ends up being NULL, it properly passes the original values at least, if $data is a proper array instead, the code keeps processing everything else as usual.

===

The code is slightly different in v5, where an empty array is passed instead of NULL, but the change is also still relevant for it.

Länk till full forum post

Rekommenderade Poster

Inga poster att visa

Joina konversation

Du kan posta nu och registrera dig senare. Om du har ett konto, logga in nu för att posta med ditt konto.

Gäst
Svara på detta ämne...

Forumstatistik

  • Antal ämnen 471
  • Antal inlägg 483

Konto

Navigation

Sök

Sök

Konfigurera webbläsarens push meddelanden

Chrome (Android)
  1. Tryck på låsikonen bredvid adressfältet.
  2. Tryck på Behörigheter → Aviseringar.
  3. Justera dina inställningar.
Chrome (Skrivbord)
  1. Klicka på hänglåsikonen i adressfältet.
  2. Välj Webbplatsinställningar.
  3. Hitta Meddelanden och justera dina inställningar.