Miss_B Posted September 14, 2021 Share Posted September 14, 2021 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. Link to comment Share on other sites More sharing options...
Adriano Faria Posted September 14, 2021 Share Posted September 14, 2021 Check your EditorLocation extension. Miss_B 1 Link to comment Share on other sites More sharing options...
Miss_B Posted September 14, 2021 Author Share Posted September 14, 2021 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(); } } Link to comment Share on other sites More sharing options...
Solution Adriano Faria Posted September 14, 2021 Solution Share Posted September 14, 2021 See the method attachmentLookup. It’s wrong. Open same extension from any other and compares to yours. Miss_B 1 Link to comment Share on other sites More sharing options...
Miss_B Posted September 14, 2021 Author Share Posted September 14, 2021 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. Link to comment Share on other sites More sharing options...
Adriano Faria Posted September 14, 2021 Share Posted September 14, 2021 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). Miss_B 1 Link to comment Share on other sites More sharing options...
Miss_B Posted September 14, 2021 Author Share Posted September 14, 2021 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 😊 Link to comment Share on other sites More sharing options...
Recommended Posts