1
Neobless
Hack for multi upload atavars
  • 2004/1/22 17:08

  • Neobless

  • Just popping in

  • Posts: 11

  • Since: 2004/1/22


I have hacked the XOOPS core to allow multi uploads with avatars, hope this helps other.

1, Create a folder called cache in uploads and CHMOD 0777.

2, Edit the following file modules/system/admin/avatars/main.php

At line 52 replace the whole case 'list' with this code:

if ( $op == 'list' )
    {
        
xoops_cp_header();
        echo 
'<h4 style="text-align:left">' . _MD_AVATARMAN . '</h4>';
        
$avt_handler = &xoops_gethandler( 'avatar' );
        
$savatar_count = $avt_handler->getCount( new Criteria( 'avatar_type', 'S' ) );
        
$cavatar_count = $avt_handler->getCount( new Criteria( 'avatar_type', 'C' ) );
        echo 
'<ul><li>' . _MD_SYSAVATARS . ' (' . sprintf( _NUMIMAGES, '<b>' . $savatar_count . '</b>' ) . ') [<a href="admin.php?fct=avatars&op=listavt&type=S">' . _LIST . '</a>]</li><li>' . _MD_CSTAVATARS . ' (' . sprintf( _NUMIMAGES, '<b>' . $cavatar_count . '</b>' ) . ') [<a href="admin.php?fct=avatars&op=listavt&type=C">' . _LIST . '</a>]</li></ul>';

        include_once 
XOOPS_ROOT_PATH . '/class/xoopsformloader.php';
        include_once 
XOOPS_ROOT_PATH . "/modules/wfsection/class/wfslists.php";
        
$iform = new XoopsThemeForm( _MD_ADDAVT, 'avatar_form', 'admin.php' );
        
$iform->setExtra( 'enctype="multipart/form-data"' );
        
$graph_array = &XoopsLists::getImgListAsArray( XOOPS_ROOT_PATH . "/uploads/cache" );
        
WfsLists::getarray( XOOPS_ROOT_PATH . "/uploads/cache" );
        echo 
$htmlarray;
        
$atvarslisting = array();

        
$smallimage_select = new XoopsFormSelect( '', 'atvarslisting', '', 10, true );
        
$smallimage_select->addOptionArray( $graph_array );
        
$smallimage_tray = new XoopsFormElementTray( "Upload Batch Avatars:", '&nbsp;' );
        
$smallimage_tray->addElement( $smallimage_select );

        
$iform->addElement( $smallimage_tray );
        
$iform->addElement( new XoopsFormText( _IMGWEIGHT, 'avatar_weight', 3, 4, 0 ) );
        
$iform->addElement( new XoopsFormRadioYN( "Use Auto Weight?", 'avatar_autoweight', 0, _YES, _NO ) );
        
$iform->addElement( new XoopsFormRadioYN( _IMGDISPLAY, 'avatar_display', 1, _YES, _NO ) );
        
$iform->addElement( new XoopsFormHidden( 'op', 'batchaddfile' ) );
        
$iform->addElement( new XoopsFormHidden( 'fct', 'avatars' ) );
        
$iform->addElement( new XoopsFormButton( '', 'avt_button', _SUBMIT, 'submit' ) );
        
$iform->display();

        
$form = new XoopsThemeForm( _MD_ADDAVT, 'avatar_form', 'admin.php' );
        
$form->setExtra( 'enctype="multipart/form-data"' );
        
$form->addElement( new XoopsFormText( _IMAGENAME, 'avatar_name', 50, 255 ), true );
        
$form->addElement( new XoopsFormFile( _IMAGEFILE, 'avatar_file', 500000 ) );
        
$form->addElement( new XoopsFormText( _IMGWEIGHT, 'avatar_weight', 3, 4, 0 ) );
        
$form->addElement( new XoopsFormRadioYN( _IMGDISPLAY, 'avatar_display', 1, _YES, _NO ) );
        
$form->addElement( new XoopsFormHidden( 'op', 'addfile' ) );
        
$form->addElement( new XoopsFormHidden( 'fct', 'avatars' ) );
        
$form->addElement( new XoopsFormButton( '', 'avt_button', _SUBMIT, 'submit' ) );
        
$form->display();
        
xoops_cp_footer();
        exit();
    }

and after case 'save' add add this:

if ( $op == 'batchaddfile' )
    {
        include_once 
XOOPS_ROOT_PATH . '/class/uploader.php';

        global 
$xoopsConfigUser;

        function 
getmimetype( $ext )
        {
            
$mimetypes = mimetype();
            if ( isset( 
$mimetypes[$ext] ) )
            {
                return 
$mimetypes[$ext];
            } 
            else
            {
                return 
false;
            } 
        } 

        function 
mimetype()
        {
            return array( 
"gif" => "image/gif",
                
"ief" => "image/ief",
                
"jpeg" => "image/pjpeg",
                
"jpeg" => "image/jpeg",
                
"jpg" => "image/jpeg",
                
"jpe" => "image/jpeg",
                
"png" => "image/x-png",
                
"unknown" => "application/octet-stream" 
                
);
        } 

        
$allowedmimetypes = array( 'image/gif', 'image/jpeg', 'image/pjpeg', 'image/x-png', 'image/png' );
        
$sourcepath = XOOPS_ROOT_PATH . '/uploads/cache/';
        
$destpath = XOOPS_ROOT_PATH . '/uploads/';
        
$err = array();
        
$ucount = count( $HTTP_POST_VARS['atvarslisting'] );

        for ( 
$i = 0; $i < $ucount; $i++ )
        {
            
$sourcefile = strtolower( basename( $HTTP_POST_VARS['atvarslisting'][$i] ) );

            if ( @!
file_exists( $sourcepath . $sourcefile ) )
            {
                
$err[] = "File " . basename( $sourcefile ) . " does not exist in path " . $sourcepath . "<br />";
                continue;
            } 
            
// file size check, XOOPS doesn't do this when uploading? maybe it should?
            
if ( is_file( $sourcepath . $sourcefile ) )
            {
                
$size = filesize( $sourcepath . $sourcefile );
                if ( 
$size > $xoopsConfigUser['avatar_maxsize'] )
                {
                    
$err[] = "File size for " . basename( $sourcefile ) . " exceeds the ".$xoopsConfigUser['avatar_maxsize']." bytes limit.<br />";
                    continue;
                } 
            } 
            
$mediaDimension = getimagesize( $sourcepath . $sourcefile );
            if ( 
$mediaDimension[0] > $xoopsConfigUser['avatar_width'] || $mediaDimension[1] > $xoopsConfigUser['avatar_height'] )
            {
                
$err[] = "File height or/and width (".$mediaDimension[1]." x ".$mediaDimension[0].") for file: " . basename( $sourcefile ) . "  exceeds the " . $xoopsConfigUser['avatar_width'] . " x " . $xoopsConfigUser['avatar_height'] . " limit";
                continue;
            } 
            
// split filename
            
$filename = explode( '.', $sourcefile );
            
$basename = $filename['0'];
            
$ext = $filename['1'];
            
$filemimetype = getmimetype( $ext );
            if ( 
$filemimetype == false )
            {
                
$err[] = "Unknown filetype for file " . $sourcefile . "<br />File has not been copied into the database.<br />";
                continue;
            } 
            if ( 
count( $allowedmimetypes ) > 0 && !in_array( $filemimetype, $allowedmimetypes ) )
            {
                
$err[] = "Not allowed mimetype for file " . $sourcefile . "<br />File has not been copied into the database.<br />";
                continue;
            } 
            
$destfile = uniqid( 'savt' ) . '.' . $ext; 
            
// copy files over with new name and delete the old one
            
if ( !copy( $sourcepath . $sourcefile, $destpath . $destfile ) )
            {
                
$err[] = "Error copying " . $sourcefile . " to path" . $destpath . ". ";
            } 
            else
            {
                
touch( $destpath . $destfile );
                
chmod( $destpath . $destfile, 0644 );
                if (!
chmod( $sourcepath, 0777 ))
                {
                    
$err[] = "Error changing write permission on path" . $sourcepath . ", please change to 0777";
                }
                
chmod( $sourcepath . $sourcefile, 0666 );
                if ( !
unlink( $sourcepath . $sourcefile ) )
                {
                    
$err[] = "Error deleting " . $sourcefile . " to path" . $destpath . " ";
                    
$deleteme = $sourcepath . $sourcefile . "deleteme";
                    if ( @
rename( $sourcepath . $sourcefile, $deleteme ) )
                    {
                        
touch( $deleteme );
                        
chmod( $deleteme, 0644 );
                    } 
                } 
            } 
            
$avt_handler = &xoops_gethandler( 'avatar' );
            
$avatar = &$avt_handler->create();
            
$avatar->setVar( 'avatar_file', $destfile );
            
$avatar->setVar( 'avatar_name', $basename );
            
$avatar->setVar( 'avatar_mimetype', $filemimetype );
            
$avatar_display = empty( $avatar_display ) ? 0 : 1;
            
$avatar->setVar( 'avatar_display', $avatar_display );
            if ( 
$avatar_autoweight == 1 )
            {
                
$avatar->setVar( 'avatar_weight', $i + 1 );
            } 
            else
            {
                
$avatar->setVar( 'avatar_weight', $avatar_weight );
            } 
            
$avatar->setVar( 'avatar_type', 'S' );
            if ( !
$avt_handler->insert( $avatar ) )
            {
                
$err[] = sprintf( _FAILSAVEIMG, $avatar->getVar( 'avatar_name' ) );
            } 
        } 
        if ( 
count( $err ) > 0 )
        {
            
xoops_cp_header();
            
xoops_error( $err );
            
xoops_cp_footer();
            exit();
        } 
        
redirect_header( 'admin.php?fct=avatars', 2, _MD_AM_DBUPDATED );
    }

How it works, copy all your new atavars to the cache folder and select the atavars you wish to upload and click on submit.

You should now have multi atavars


2
IncommingForce
Re: Hack for multi upload atavars

Dis is a fantastic hack !!

I intalled and uploaded over a 100 new atavars without a probelm !!

Thanks Neobless for this !

3
sunsnapper
Re: Hack for multi upload avatars

This would be a nice feature to add to the core... whether in this form or another.

4
morris
Re: Hack for multi upload atavars
  • 2004/1/22 22:49

  • morris

  • Just popping in

  • Posts: 54

  • Since: 2003/9/25


Is it possible to download the main.php file completely because I don't understand where to place the following: and after case 'save' add add this:
etc.

Thanks.

5
Neobless
Re: Hack for multi upload atavars
  • 2004/1/22 23:29

  • Neobless

  • Just popping in

  • Posts: 11

  • Since: 2004/1/22


Geezz!!

Download it!!!

6
morris
Re: Hack for multi upload atavars
  • 2004/1/23 21:39

  • morris

  • Just popping in

  • Posts: 54

  • Since: 2003/9/25


Thanks for the file, but it doesn't work for me.
I created a cache dir (0777)in the uploads dir but I only see the following in the avatar manager:

Avatar Manager
System Avatars (18 images) [List]
Custom Avatars (2 images) [List]

No possibility to select the avatars in the cache dir!

Am I doing something wrong?

Morris.

7
Brad
Re: Hack for multi upload atavars
  • 2004/2/17 21:29

  • Brad

  • Not too shy to talk

  • Posts: 150

  • Since: 2003/12/4


I'm not seeing anything different either, after applying this hack to XOOPS 2.0.6.

[minutes later...]

Alright, I see the f*ck*ng problem. This hack ASSUMES that the person applying it has WF-Sections installed.

8
ukandrewf
Re: Hack for multi upload atavars
  • 2004/3/7 20:07

  • ukandrewf

  • Friend of XOOPS

  • Posts: 198

  • Since: 2002/12/2


i know this is probably pretty dumb but...

When I try to copy the code from the above examples the structure of the code is f*cked up. I'm sure i did it once before but this time it's just putting all the code in as 2 lines which isn't much good.

Also the download link isn't working for the main.php file so I can't download and get it from there.

Any ideas?

9
Gamut
Re: Hack for multi upload atavars
  • 2004/4/7 6:56

  • Gamut

  • Just popping in

  • Posts: 34

  • Since: 2002/1/5 1


Ok I have just tried this multi-load avatar hack and got the following error:

Fatal error: Undefined class name 'wfslists' in /home/phoenix/public_html/modules/system/admin/avatars/main.php on line 69

This hack refers to a non-existent "wfslists.php" from WF-Sections class directory. Unfortunately there is no such file.

The part of the code in the hack that causes this problem is as follows:

include_once XOOPS_ROOT_PATH . '/class/xoopsformloader.php';
include_once XOOPS_ROOT_PATH . "/modules/wfsection/class/wfslists.php";
$iform = new XoopsThemeForm( _MD_ADDAVT, 'avatar_form', 'admin.php' );
$iform->setExtra( 'enctype="multipart/form-data"' );
$graph_array = &XoopsLists::getImgListAsArray( XOOPS_ROOT_PATH . "/uploads/cache"
);
WfsLists::getarray( XOOPS_ROOT_PATH . "/uploads/cache" );
echo $htmlarray;
$atvarslisting = array();



Clearly 2 things need to be changed, but to what? (wfsfiles?, wfstree?...???)

(1)XOOPS_ROOT_PATH . "/modules/wfsection/class/wfslists.php";
(2)WfsLists::getarray

Any advice would be greatly appreciated as I do not want to upload avatars one by one. (I am amazed that the avatar management is actually worse than it used to be in earlier XOOPs versions!)

10
ros256
Re: Hack for multi upload atavars
  • 2004/10/13 0:20

  • ros256

  • Just popping in

  • Posts: 3

  • Since: 2004/10/12


Hi,

I installed WF-Sections and applied the code hack above, then moved my images to the uploads/cache directory (chmod'd 0777 as directed). Now when I go to the avatars admin page (with PHP debug on) I get the following:

Avatar Manager
System Avatars (0 images) [List]
Custom Avatars (0 images) [List]
Notice [PHP]: Undefined variable: this in file modules/wfsection/class/wfslists.php line 40
Warning [PHP]: Missing argument 2 for getdirlistasarray() in file modules/wfsection/class/wfslists.php line 65

Any idea what the problem is?

Thanks,

Rosencrantz