EPrints Technical Mailing List Archive

Message: #00354


< Previous (by date) | Next (by date) > | < Previous (in thread) | Next (in thread) > | Messages - Most Recent First | Threads - Most Recent First

[EP-tech] Re: Altering DajaObj/Eprint.pm behaviour without altering core code


For render_fileinfo Tim's suggestion would be OK, but what about non-rendering methods - like 'remove'?
Currently in a modified ~/perl_lib/EPrints/DataObj/Eprint.pm, I have:

sub remove
{
...

#JLRS Added code
    my $repo = $self->{session}->get_repository->get_id;
    if( $repo eq "sherpawhiterose" ){
	# some stuff that's only applicable to 'sherpawhiterose'
	...
    }
#/JLRS Added code

	return $success;
}

Ideally this would be done somewhere in ~/archives/sherpawhiterose/cfg/, and not affect any other archives.
Could I wrap a set of rules with some kind of archive-specific selector:
[in this archive]
	*EPrints::DataObj::EPrint::remove = \&patched_DataObj_EPrint_remove;
	*EPrints::DataObj::EPrint::move_to_archive = \&patched_DataObj_EPrint_move_to_archive;
[/in this archive]

Cheers,
John

-----Original Message-----
From: eprints-tech-bounces@ecs.soton.ac.uk [mailto:eprints-tech-bounces@ecs.soton.ac.uk] On Behalf Of Sebastien Francois
Sent: 04 April 2012 16:05
To: eprints-tech@ecs.soton.ac.uk
Subject: [EP-tech] Re: Altering DajaObj/Eprint.pm behaviour without altering core code

On 04/04/12 15:49, John Salter wrote:
> I really meant to suggest making the change in ~/archives/[ID]/cfg/cfg.d/core_overrides.pl
>   - would a change in there result in this inheritance?
I think it would since EPrints::DataObj::EPrint.pm is loaded once by the 
webserver and you're changing it.

What about Tim Brody's suggestion? That would be rather clean.

Alternatively, try something like that:

*EPrints::DataObj::EPrint::render_fileinfo = \&patched_render_fileinfo;


sub patched_render_fileinfo
{
	my( $session, $field, $value, $alllangs, $nolink, $eprint ) = @_;

	if( $session->can_call( 'local_render_fileinfo' ) )
	{
		return $session->call( 'local_render_fileinfo', $session, $field, $value, $alllangs, $nolink, $eprint );
	}

	# original render_fileinfo code follows:
	# ...
}

$c->{local_render_fileinfo} = sub {

	# your custom code

};



If you don't define $c->{local_render_fileinfo} in your other 
repositories, then the original code will be executed.

Seb.

> I need to make the change in one archive only!
>
> Cheers,
> John
>
> -----Original Message-----
> From: eprints-tech-bounces@ecs.soton.ac.uk [mailto:eprints-tech-bounces@ecs.soton.ac.uk] On Behalf Of Sebastien Francois
> Sent: 04 April 2012 15:41
> To: eprints-tech@ecs.soton.ac.uk
> Subject: [EP-tech] Re: Altering DajaObj/Eprint.pm behaviour without altering core code
>
> Good! Yes I'd add a file in cfg.d/ as you suggested. However be aware
> that other repositories set up there (ie. archives/[id1],
> archives/[id2]...) will inherit the change!
>
> Seb.
>
> On 04/04/12 15:33, John Salter wrote:
>> Thanks Seb, works like a dream!
>>
>> Do you have any 'good practice' advice on how to do this within an archive?
>> I already have ~/archives/[ID]/cfg/plugins/... for over-riding plugins.
>> Would your advice be to add something within there, or to add something like cfg.d/core_overrides.pl?
>>
>> Cheers,
>> John
>>
>> -----Original Message-----
>> From: eprints-tech-bounces@ecs.soton.ac.uk [mailto:eprints-tech-bounces@ecs.soton.ac.uk] On Behalf Of Sebastien Francois
>> Sent: 04 April 2012 12:29
>> To: eprints-tech@ecs.soton.ac.uk
>> Subject: [EP-tech] Re: Altering DajaObj/Eprint.pm behaviour without altering core code
>>
>> What about:
>>
>> *EPrints::DataObj::EPrint::render_fileinfo = \&my_render_fileinfo;
>>
>> sub my_render_fileinfo
>> {
>> # your code ...
>> }
>>
>> Seb.
>>
>>
>> On 04/04/12 12:18, John Salter wrote:
>>> I'm trying to do something the 'right way'*.
>>> This advice: http://wiki.eprints.org/w/Read_Only_Directories says I shouldn't be editing anything under eprints3/perl_lib/ (with a couple of exceptions).
>>>
>>> I need to alter the 'render_fileinfo' subroutine in ~/perl_lib/EPrints/DataObj/EPrint.pm.
>>> How do I achieve this without:
>>>     - altering the Eprint.pm file
>>>     - ending up with some 'Subroutine render_fileinfo redefined' messages
>>>     - using "no warnings 'redefine';" ;o)
>>>
>>> I've tried various attempts - without success.
>>> I'm sure it can be done, and I'm sure it's a bit of perl magic I'm missing, and hopefully someone here can help!
>>>
>>> Cheers,
>>> John
>>>
>>> *http://blogs.ecs.soton.ac.uk/oneshare/2009/09/25/taking-stock-and-mopping-up-the-mess-i-made-of-eprints/
>>> *** Options: http://mailman.ecs.soton.ac.uk/mailman/listinfo/eprints-tech
>>> *** Archive: http://www.eprints.org/tech.php/
>>> *** EPrints community wiki: http://wiki.eprints.org/
>> *** Options: http://mailman.ecs.soton.ac.uk/mailman/listinfo/eprints-tech
>> *** Archive: http://www.eprints.org/tech.php/
>> *** EPrints community wiki: http://wiki.eprints.org/
>>
>> *** Options: http://mailman.ecs.soton.ac.uk/mailman/listinfo/eprints-tech
>> *** Archive: http://www.eprints.org/tech.php/
>> *** EPrints community wiki: http://wiki.eprints.org/
> *** Options: http://mailman.ecs.soton.ac.uk/mailman/listinfo/eprints-tech
> *** Archive: http://www.eprints.org/tech.php/
> *** EPrints community wiki: http://wiki.eprints.org/
>
> *** Options: http://mailman.ecs.soton.ac.uk/mailman/listinfo/eprints-tech
> *** Archive: http://www.eprints.org/tech.php/
> *** EPrints community wiki: http://wiki.eprints.org/

*** Options: http://mailman.ecs.soton.ac.uk/mailman/listinfo/eprints-tech
*** Archive: http://www.eprints.org/tech.php/
*** EPrints community wiki: http://wiki.eprints.org/