Jump to content

What is wrong with this code?


Go to solution Solved by Adriano Faria,

Recommended Posts

Posted

Hello,

I have developed an app that places topics on a scheduled list to be posted at a later time. On my end everything works fine, but I have gotten a message from the MP moderator that it is throwing the following error:

INSERT INTO `core_attachments_map` ( `attachment_id`, `location_key`, `id1`, `id2`, `id3`, `temp`, `lang` ) VALUES ( 1, 'scheduledtopics_scheduledtopics', NULL, 'scheduledtopics', NULL, array (
0 => NULL,
1 => 'scheduledtopics',
), NULL ) ON DUPLICATE KEY UPDATE `attachment_id`=VALUES(`attachment_id`), `location_key`=VALUES(`location_key`), `id1`=VALUES(`id1`), `id2`=VALUES(`id2`), `id3`=VALUES(`id3`), `temp`=VALUES(`temp`), `lang`=VALUES(`lang`)
IPS\Db\Exception: Incorrect integer value: 'scheduledtopics' for column 'id2' at row 1 (1366)

As mentioned, I can not reproduce this myself. And the code that I am using for the editor is the same like in my other apps.

This is the form for the editor:

$scheduled = new \IPS\scheduledtopics\Scheduledtopics;
		   
		$form = new \IPS\Helpers\Form;
		$form->class .= ' ipsPad';

$form->add( new \IPS\Helpers\Form\Editor( 'topic_message', NULL, TRUE, array( 'app' => 'scheduledtopics', 'key' => 'scheduledtopics', 'autoSaveKey' => 'topic_message', 'attachIds' => NULL ) ) );

if ( $values = $form->values() )
{
	$scheduled->topic_message = $values['topic_message'];
			
	/* Insert in the database */	
	$scheduled->save();
			
	\IPS\File::claimAttachments( 'topic_message', $scheduled->id );		
}

 

Can someone please tell me is there is anything wrong with the code? I would really appreciate it.

Posted
3 minutes ago, Adriano Faria said:

Check your EditorLocation extension. 

It contains the same code that I have used in my other apps. But maybe I am missing something...

/**
 * Editor Extension: scheduledtopics
 */
class _scheduledtopics
{
	/**
	 * Can we use HTML in this editor?
	 *
	 * @param	\IPS\Member	$member	The member
	 * @return	bool|null	NULL will cause the default value (based on the member's permissions) to be used, and is recommended in most cases. A boolean value will override that.
	 */
	public function canUseHtml( $member )
	{
		return NULL;
	}
	
	/**
	 * Can we use attachments in this editor?
	 *
	 * @param	\IPS\Member					$member	The member
	 * @param	\IPS\Helpers\Form\Editor	$field	The editor field
	 * @return	bool|null	NULL will cause the default value (based on the member's permissions) to be used, and is recommended in most cases. A boolean value will override that.
	 */
	public function canAttach( $member, $field )
	{
		return NULL;
	}
	
	/**
	 * Permission check for attachments
	 *
	 * @param	\IPS\Member	$member		The member
	 * @param	int|null	$id1		Primary ID
	 * @param	int|null	$id2		Secondary ID
	 * @param	string|null	$id3		Arbitrary data
	 * @param	array		$attachment	The attachment data
	 * @param	bool		$viewOnly	If true, just check if the user can see the attachment rather than download it
	 * @return	bool
	 */
	public function attachmentPermissionCheck( $member, $id1, $id2, $id3, $attachment, $viewOnly=FALSE )
	{
	    /* Make sure that you add a relevant permission check to prevent attachments being accessed via ID enumeration. */
		return TRUE;
	}
	
	/**
	 * Attachment lookup
	 *
	 * @param	int|null	$id1	Primary ID
	 * @param	int|null	$id2	Secondary ID
	 * @param	string|null	$id3	Arbitrary data
	 * @return	\IPS\Http\Url|\IPS\Content|\IPS\Node\Model
	 * @throws	\LogicException
	 */
	public function attachmentLookup( $id1, $id2, $id3 )
	{
		 // return \IPS\Http\Url::internal( ... );
	}

	/**
	 * Rebuild attachment images in non-content item areas
	 *
	 * @param	int|null	$offset	Offset to start from
	 * @param	int|null	$max	Maximum to parse
	 * @return	int			Number completed
	 * @note	This method is optional and will only be called if it exists
	 */
	public function rebuildAttachmentImages( $offset, $max )
	{
		return $this->performRebuild( $offset, $max, array( 'IPS\Text\Parser', 'rebuildAttachmentUrls' ) );
	}

	/**
	 * Rebuild content post-upgrade
	 *
	 * @param	int|null	$offset	Offset to start from
	 * @param	int|null	$max	Maximum to parse
	 * @return	int			Number completed
	 * @note	This method is optional and will only be called if it exists
	 */
	public function rebuildContent( $offset, $max )
	{
		return $this->performRebuild( $offset, $max, array( 'IPS\Text\LegacyParser', 'parseStatic' ) );
	}

	/**
	 * @brief	Use the cached image URL instead of the original URL
	 */
	protected $proxyUrl	= FALSE;
	
	/**
	 * Rebuild content to add or remove image proxy
	 *
	 * @param	int|null		$offset		Offset to start from
	 * @param	int|null		$max		Maximum to parse
	 * @param	bool			$proxyUrl	Use the cached image URL instead of the original URL
	 * @return	int			Number completed
	 * @note	This method is optional and will only be called if it exists
	 */
	public function rebuildImageProxy( $offset, $max, $proxyUrl = FALSE )
	{
		$this->proxyUrl = $proxyUrl;
		return $this->performRebuild( $offset, $max, 'parseImageProxy' );
	}

    /**
	 * @brief	Store lazy loading status ( true = enabled )
	 */
	protected $_lazyLoadStatus = null;
	
	/**
	 * Rebuild content to add or remove lazy loading
	 *
	 * @param	int|null		$offset		Offset to start from
	 * @param	int|null		$max		Maximum to parse
	 * @param	bool			$status		Enable/Disable lazy loading
	 * @return	int			Number completed
	 * @note	This method is optional and will only be called if it exists
	 */
	public function rebuildLazyLoad( $offset, $max, $status=TRUE )
	{
		$this->_lazyLoadStatus = $status;

		return $this->performRebuild( $offset, $max, 'parseLazyLoad' );
	}
	
	/**
	 * Perform rebuild - abstracted as the call for rebuildContent() and rebuildAttachmentImages() is nearly identical
	 *
	 * @param	int|null	$offset		Offset to start from
	 * @param	int|null	$max		Maximum to parse
	 * @param	callable	$callback	Method to call to rebuild content
	 * @return	int			Number completed
	 */
    protected function performRebuild( $offset, $max, $callback )
	{
		$did = 0;

		foreach( \IPS\Db::i()->select( '*', 'scheduledtopics_logs', null, 'id ASC', array( $offset, $max ) ) as $scheduled )
		{
			$did++;
			try
			{
				if( $callback == 'parseImageProxy' )
				{
					$rebuilt = \IPS\Text\Parser::removeImageProxy( $scheduled['topic_message'] );
				}
				elseif( $callback == 'parseLazyLoad' )
				{
					$rebuilt = \IPS\Text\Parser::parseLazyLoad( $scheduled['topic_message'], $this->_lazyLoadStatus );
				}
				else
				{
					$rebuilt = $callback( $scheduled['topic_message'] );
				}
				
			}
			catch( \InvalidArgumentException $e )
			{
				if( $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
				{
					$rebuilt = preg_replace( "#\[/?([^\]]+?)\]#", '', $scheduled['topic_message'] );
				}
				else
				{
					throw $e;
				}
			}

			if( $rebuilt !== FALSE )
			{
				\IPS\Db::i()->update( 'scheduledtopics_logs', array( 'topic_message' => $rebuilt ), array( 'id=?', $scheduled['id'] ) );
			}
		}

		return $did;
	}

	/**
	 * Total content count to be used in progress indicator
	 *
	 * @return	int			Total Count
	 */
	public function contentCount()
	{
        return \IPS\Db::i()->select( 'COUNT(*) as count', 'scheduledtopics_logs', "topic_message IS NOT NULL" )->first();
	}
}

 

Posted
3 minutes ago, Adriano Faria said:

See the method attachmentLookup. It’s wrong. 

Open same extension from any other and compares to yours.

I see. What buffels me is that I can not reproduce the error at all. 

Anyways, I can return the model with this:

public function attachmentLookup( $id1, $id2, $id3 )
	{
        return \IPS\scheduledtopics\Scheduledtopics::load( $id1 );
	}

Will that be ok?

Thank you very much for your help btw @Adriano Faria

 

Posted
1 minute ago, Miss_B said:

I see. What buffels me is that I can not reproduce the error at all. 

Use the browser dev tools (Console) as upload is ajaxed. You will probably see the error there.

2 minutes ago, Miss_B said:

Will that be ok?

Probably. Attach a file and open the table in the PHPMyAdmin and see which column it updates (id1, id2 or id3).

Posted
21 minutes ago, Adriano Faria said:

Use the browser dev tools (Console) as upload is ajaxed. You will probably see the error there.

Probably. Attach a file and open the table in the PHPMyAdmin and see which column it updates (id1, id2 or id3).

I did use the dev tools, but I could not see any errors pertaining to this. And in the other apps did not cause any errors.

Anyways, I added the fix, hopefully that will fix it. Many many thanks for your time and help. It is much appreciated 😊

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...