Seditio Source
Root |
./othercms/ips_4.3.4/applications/gallery/modules/front/gallery/notes.php
<?php
/**
 * @brief        Store and retrieve image notes
 * @author        <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
 * @copyright    (c) Invision Power Services, Inc.
 * @license        https://www.invisioncommunity.com/legal/standards/
 * @package        Invision Community
 * @subpackage    Gallery
 * @since        21 Mar 2014
 * @note        This is available via javascript-only by the nature of the feature in question.
 * @note        This is a custom callback script for the jQuery-Notes plugin
 * @link        <a href='http://jquery-notes.rydygel.de/'>http://jquery-notes.rydygel.de/</a>
 */

namespace IPS\gallery\modules\front\gallery;

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
   
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
    exit;
}

/**
 * Store and retrieve image notes
 */
class _notes extends \IPS\Dispatcher\Controller
{
   
/**
     * Determine what to show
     *
     * @return    void
     */
   
protected function manage()
    {
        try
        {
           
$this->image = \IPS\gallery\Image::load( \IPS\Request::i()->imageId );
           
            if ( !
$this->image->canView( \IPS\Member::loggedIn() ) )
            {
                \
IPS\Output::i()->error( 'node_error', '2G191/1', 403, '' );
            }
        }
        catch ( \
OutOfRangeException $e )
        {
            \
IPS\Output::i()->error( 'node_error', '2G191/2', 404, '' );
        }

       
$response    = NULL;

       
/* jQuery-Notes will send 'image' parameter which we can ignore */
       
$noteId        = \IPS\Request::i()->id;
       
$position    = \IPS\Request::i()->position;
       
$note        = strip_tags( \IPS\Request::i()->note );

        if( \
IPS\Request::i()->get )
        {
           
$response    = $this->image->_notes;
        }
        else if( \
IPS\Request::i()->add )
        {
           
$response    = $this->_addNote( $position, $note );
        }
        else if( \
IPS\Request::i()->delete )
        {
           
$response    = $this->_deleteNote( $noteId );
        }
        else if( \
IPS\Request::i()->edit )
        {
           
$response    = $this->_editNote( $noteId, $position, $note );
        }

        \
IPS\Output::i()->json( $response );
    }

   
/**
     * Delete an image note
     *
     * @param    int        $id        Note ID to delete
     * @return    bool
     */
   
protected function _deleteNote( $id )
    {
       
/* Check permission */
       
if( !$this->image->canEdit() )
        {
            \
IPS\Output::i()->error( 'notes_no_permission', '2G191/3', 403, '' );
        }

        \
IPS\Session::i()->csrfCheck();

       
$notes    = $this->image->_notes;

        foreach(
$notes as $key => $note )
        {
            if(
$note['ID'] == $id )
            {
                unset(
$notes[ $key ] );
                break;
            }
        }

       
$this->image->_notes    = $notes;
       
$this->image->save();

        return
'ok';
    }

   
/**
     * Add an image note
     *
     * @param    mixed    $position    Note position
     * @param    string    $note        Note text
     * @return    bool
     */
   
protected function _addNote( $position, $note )
    {
       
/* Check permission */
       
if( !$this->image->canEdit() )
        {
            \
IPS\Output::i()->error( 'notes_no_permission', '2G191/4', 403, '' );
        }

        \
IPS\Session::i()->csrfCheck();

       
$notes        = $this->image->_notes;
       
$position    = explode( ',', $position );

        if(
count( $position ) != 4 )
        {
            return
FALSE;
        }

       
$maxNoteId    = 0;

        foreach(
$notes as $_note )
        {
            if(
$_note['ID'] > $maxNoteId )
            {
               
$maxNoteId    = $_note['ID'];
            }
        }

       
$notes[]    = array(
           
'ID'        => $maxNoteId + 1,
           
'LEFT'        => round( $position[0], 5 ),
           
'TOP'        => round( $position[1], 5 ),
           
'WIDTH'        => round( $position[2], 5 ),
           
'HEIGHT'    => round( $position[3], 5 ),
           
'NOTE'        => trim( str_replace( "\n", ' ', str_replace( '  ', ' ', $note ) ) ),
        );

       
$this->image->_notes    = $notes;
       
$this->image->save();

        return array(
'id' => $maxNoteId + 1 );
    }

   
/**
     * Edit an image note
     *
     * @param    int        $id            Note ID to edit
     * @param    mixed    $position    Note position
     * @param    string    $note        Note text
     * @return    bool
     */
   
protected function _editNote( $id, $position='', $noteText='' )
    {
       
/* Check permission */
       
if( !$this->image->canEdit() )
        {
            \
IPS\Output::i()->error( 'notes_no_permission', '2G191/5', 403, '' );
        }

        \
IPS\Session::i()->csrfCheck();

       
$notes        = $this->image->_notes;
       
$position    = explode( ',', $position );

        foreach(
$notes as $key => $note )
        {
            if(
$note['ID'] == $id )
            {
               
$notes[ $key ]    = $note;

                if(
$noteText )
                {
                   
$notes[ $key ]['NOTE']        = trim( str_replace( "\n", ' ', str_replace( '  ', ' ', $noteText ) ) );
                }

                if(
count( $position ) == 4 )
                {
                   
$notes[ $key ]['LEFT']         = round( $position[0], 5 );
                   
$notes[ $key ]['TOP']        = round( $position[1], 5 );
                   
$notes[ $key ]['WIDTH']        = round( $position[2], 5 );
                   
$notes[ $key ]['HEIGHT']    = round( $position[3], 5 );
                }

                break;
            }
        }

       
$this->image->_notes    = $notes;
       
$this->image->save();

        return
'ok';
    }
}