Interchange6-Schema
view release on metacpan or search on metacpan
lib/Interchange6/Schema/Result/Product.pm view on Meta::CPAN
has_many
product_attributes => "Interchange6::Schema::Result::ProductAttribute",
"sku",
{ cascade_copy => 0, cascade_delete => 0 };
=head2 media
Type: many_to_many with media
=cut
many_to_many media => "media_products", "media";
=head2 product_messages
Type: has_many
Related object: L<Interchange6::Schema::Result::ProductMessage>
=cut
has_many
product_messages => "Interchange6::Schema::Result::ProductMessage",
"sku", { cascade_copy => 0 };
=head2 messages
Type: many_to_many
Accessor to related Message results.
=cut
many_to_many messages => "product_messages", "message";
=head1 METHODS
Attribute methods are provided by the L<Interchange6::Schema::Base::Attribute> class.
=head2 insert
Override inherited method to call L</generate_uri> method in case L</name>
and L</sku> have been supplied as arguments but L</uri> has not.
=cut
sub insert {
my ( $self, @args ) = @_;
$self->generate_uri unless $self->uri;
$self->next::method(@args);
return $self;
}
=head2 update_price_modifiers
Called when L</price> is updated.
=cut
sub update_price_modifiers {
my ( $self, $old_value, $new_value ) = @_;
my $price_modifiers =
$self->price_modifiers->search( { discount => { '!=' => undef } } );
while ( my $result = $price_modifiers->next ) {
$result->update(
{
price => sprintf( "%.2f",
$new_value - ( $new_value * $result->discount / 100 ) )
}
);
}
}
=head2 generate_uri($attrs)
Called by L</new> if no uri is given as an argument.
The following steps are taken:
=over
1. Join C<< $self->name >> and C<< $self->uri >> with C<-> and stash
in C<$uri> to allow manipulation via filters
2. Remove leading and trailing spaces and replace remaining spaces and
C</> with C<->
3. Search for all rows in L<Interchange6::Schema::Result::Setting> where
C<scope> is C<Product> and C<name> is <generate_uri_filter>
4. For each row found eval C<< $row->value >>
5. Finally set the value of column L</uri> to C<$uri>
=back
Filters stored in L<Interchange6::Schema::Result::Setting> are executed via
eval and have access to C<$uri> and also the product result held in
C<$self>
Examples of filters stored in Setting might be:
{
scope => 'Product',
name => 'generate_uri_filter',
value => '$uri =~ s/badstuff/goodstuff/gi',
},
{
scope => 'Product',
name => 'generate_uri_filter',
value => '$uri = lc($uri)',
},
=cut
sub generate_uri {
my $self = shift;
( run in 1.981 second using v1.01-cache-2.11-cpan-437f7b0c052 )