Seditio Source
Root |
./othercms/b2evolution_7.2.3/inc/links/links.ctrl.php
<?php
/**
 * This file implements the UI controller for link objects.
 *
 * b2evolution - {@link http://b2evolution.net/}
 * Released under GNU GPL License - {@link http://b2evolution.net/about/gnu-gpl-license}
 * @copyright (c)2003-2020 by Francois Planque - {@link http://fplanque.com/}
 *
 * @package admin
 */
if( !defined('EVO_MAIN_INIT') ) die( 'Please, do not access this page directly.' );

/**
 * @var AdminUI
 */
global $AdminUI;

global
$Collection, $Blog, $Session;

/*
 * Initialize everything
 */
$action = param_action( 'list' );
$redirect_to = param( 'redirect_to', 'url', /*regenerate_url( '', '', '', '&' )*/NULL );
//$mode = 'iframe';

switch( $action )
{
    case
'set_link_position':
       
param('link_position', 'string', true);
    case
'unlink':
    case
'delete':
    case
'link_move_up':
    case
'link_move_down':
       
// Name of the iframe we want some action to come back to:
       
param( 'iframe_name', 'string', '', true );

       
// TODO fp> when moving an "after_more" above a "teaser" img, it should change to "teaser" too.
        // TODO fp> when moving a "teaser" below an "aftermore" img, it should change to "aftermore" too.

       
param( 'link_ID', 'integer', true );
       
$LinkCache = & get_LinkCache();
        if( (
$edited_Link = & $LinkCache->get_by_ID( $link_ID, false )) !== false )
        {    
// We have a link, get the LinkOwner it is attached to:
           
$LinkOwner = & $edited_Link->get_LinkOwner();

           
// Load the blog we're in:
           
$Collection = $Blog = & $LinkOwner->get_Blog();
           
set_working_blog( $Blog->ID );
        }
        else
        {    
// We could not find the link to edit:
           
$Messages->add( sprintf( TB_('Requested &laquo;%s&raquo; object does not exist any longer.'), TB_('Link') ), 'error' );
            unset(
$edited_Link );
            unset(
$link_ID );
            if(
$mode == 'iframe' )
            {
               
$action = 'edit_links';
            }
            else
            {
               
$action = 'nil';
            }
        }
        break;
}

if(
$action == 'edit_links' || $action == 'sort_links' )
{
// set LinkOwner from params
   
$link_type = param( 'link_type', 'string', 'item', true );
   
$object_ID = param( 'link_object_ID', 'integer', 0, true );
   
$LinkOwner = get_LinkOwner( $link_type, $object_ID );
    if( empty(
$Blog ) )
    {
// Load the blog we're in:
       
$Collection = $Blog = & $LinkOwner->get_Blog();
       
set_working_blog( $Blog->ID );
    }
}

if( empty(
$LinkOwner ) )
{
// If LinkOwner object is not set, we can't process any action
   
$Messages->add( TB_('Requested link owner object does not exist any longer.'), 'error' );
   
header_redirect( $redirect_to );
}

switch(
$action )
{
    case
'edit_links':
       
// Display link owner attachments

        // Check permission:
       
$LinkOwner->check_perm( 'edit', true );
        break;

    case
'unlink': // Unlink a file from object:
   
case 'delete': // Unlink and Delete a file from disk and DB completely:

        // Check that this action request is not a CSRF hacked request:
       
$Session->assert_received_crumb( 'link' );

       
// Check permission:
       
$LinkOwner->check_perm( 'edit', true );

        if(
$link_File = & $edited_Link->get_File() )
        {
           
syslog_insert( sprintf( 'File %s was unlinked from %s with ID=%s', '[['.$link_File->get_name().']]', $LinkOwner->type, $LinkOwner->get_ID() ), 'info', 'file', $link_File->ID );
        }

        if(
$action == 'delete' && $edited_Link->can_be_file_deleted() )
        {    
// Get a linked file to delete it after unlinking if it is allowed for current user:
           
$linked_File = & $edited_Link->get_File();
        }

       
// Unlink File from Item/Comment:
       
$deleted_link_ID = $edited_Link->ID;
        if(
$LinkOwner->remove_link( $edited_Link ) )
        {    
// If Link has been removed successfully:
           
unset( $edited_Link );

           
$LinkOwner->after_unlink_action( $deleted_link_ID );

           
$Messages->add( $LinkOwner->translate( 'Link has been deleted from $xxx$.' ), 'success' );

            if(
$action == 'delete' && ! empty( $linked_File ) )
            {    
// Delete a linked file from disk and DB completely:
               
$linked_File->unlink();
            }
        }

       
header_redirect( $redirect_to );
        break;

    case
'link_move_up':
    case
'link_move_down':
       
// Check that this action request is not a CSRF hacked request:
       
$Session->assert_received_crumb( "link" );

       
// Check permission:
       
$LinkOwner->check_perm( 'edit', true );

       
$ownerLinks = $LinkOwner->get_Links();

       
// TODO fp> when moving an "after_more" above a "teaser" img, it should change to "teaser" too.
        // TODO fp> when moving a "teaser" below an "aftermore" img, it should change to "aftermore" too.

        // Switch order with the next/prev one
       
if( $action == 'link_move_up' )
        {
           
$switchcond = 'return ($loop_Link->get("order") > $i
                && $loop_Link->get("order") < '
.$edited_Link->get("order").');';
           
$i = -1;
        }
        else
        {
           
$switchcond = 'return ($loop_Link->get("order") < $i
                && $loop_Link->get("order") > '
.$edited_Link->get("order").');';
           
$i = PHP_INT_MAX;
        }
        foreach(
$ownerLinks as $loop_Link )
        {
// find nearest order
           
if( $loop_Link == $edited_Link )
                continue;

            if( eval(
$switchcond) )
            {
               
$i = $loop_Link->get('order');
               
$switch_Link = $loop_Link;
            }
        }
        if(
$i > -1 && $i < PHP_INT_MAX )
        {
// switch
           
$switch_Link->set('order', $edited_Link->get('order'));

           
// HACK: go through order=0 to avoid duplicate key conflict
           
$edited_Link->set('order', 0);
           
$edited_Link->dbupdate();
           
$switch_Link->dbupdate();

           
$edited_Link->set('order', $i);
           
$edited_Link->dbupdate();


            if(
$action == 'link_move_up' )
               
$msg = TB_('Link has been moved up.');
            else
               
$msg = TB_('Link has been moved down.');

           
$Messages->add( $msg, 'success' );

           
// Update last touched date of Owners
           
$LinkOwner->update_last_touched_date();
        }
        else
        {
           
$Messages->add( TB_('Link order has not been changed.'), 'note' );
        }

       
header_redirect( $redirect_to );
        break;

    case
'sort_links':
       
// Check that this action request is not a CSRF hacked request:
       
$Session->assert_received_crumb( "link" );

       
// Check permission:
       
$LinkOwner->check_perm( 'edit', true );

       
$ownerLinks = $LinkOwner->get_Links();
       
usort( $ownerLinks, 'sort_links_by_filename' );

       
$max_order = 0;
       
$link_orders = array();
       
$link_count = count( $ownerLinks );
        foreach(
$ownerLinks as $link )
        {
            if(
$link->order > $max_order )
            {
               
$max_order = $link->order;
            }
           
$link_orders[] = $link->order;
        }

        for(
$i = 1; $i <= $link_count; $i++ )
        {
               
$ownerLinks[$i - 1]->set( 'order', $i + $max_order );
               
$ownerLinks[$i - 1]->dbupdate();
        }

        for(
$i = 1; $i <= $link_count; $i++ )
        {
            if(
$ownerLinks[$i -1]->get( 'order' ) != $i )
            {
               
$ownerLinks[$i - 1]->set( 'order', $i );
               
$ownerLinks[$i - 1]->dbupdate();
            }
        }

       
$Messages->add( TB_('The attachments have been sorted by file name.'), 'success' );

       
// Need to specify where to redirect, otherwise referrer will be used:
       
switch( $LinkOwner->type )
        {
            case
'item':
               
$redirect_url = $admin_url.'?ctrl=items&action=edit&p='.$LinkOwner->get_ID();
                break;
            case
'comment':
               
$redirect_url = $admin_url.'?ctrl=comments&action=edit&comment_ID='.$LinkOwner->get_ID();
                break;
            case
'emailcampaign':
               
$redirect_url = $admin_url.'?ctrl=campaigns&action=edit&tab=compose&ecmp_ID='.$LinkOwner->get_ID();
                break;
            default:
               
param( 'iframe_name', 'string', '', true );
               
$redirect_url = $admin_url.'?ctrl=links&action=edit_links&link_type='.$LinkOwner->type.'&mode=iframe&iframe_name='.$iframe_name.'&link_object_ID='.$LinkOwner->get_ID();
                break;
        }
       
header_redirect( $redirect_url );
        break;


    case
'set_link_position':
       
// Check that this action request is not a CSRF hacked request:
       
$Session->assert_received_crumb( 'link' );

       
// Check permission:
       
$LinkOwner->check_perm( 'edit', true );

        if(
$edited_Link->set( 'position', $link_position ) && $edited_Link->dbupdate() )
        {
           
$Messages->add( TB_('Link position has been changed.'), 'success' );

           
// Update last touched date of Owners
           
$LinkOwner->update_last_touched_date();
        }
        else
        {
           
$Messages->add( TB_('Link position has not been changed.'), 'note' );
        }

       
$header_redirect( $redirect_to );
        break;
}

// require colorbox js
require_js_helper( 'colorbox' );

$AdminUI->disp_html_head();
$AdminUI->disp_body_top( false );

switch(
$action )
{
    case
'edit_links':
       
// Memorize 'action' for prev/next links
       
memorize_param( 'action', 'string', NULL );

       
// Used to get FileRoot ID of the current Blog
       
load_class( '/files/model/_fileroot.class.php', 'FileRoot' );

       
// View attachments
       
$AdminUI->disp_view( 'links/views/_link_list.view.php' );
        break;
}

// Display body bottom, debug info and close </html>:
$AdminUI->disp_global_footer();

?>