terça-feira, 31 de julho de 2007

Joomla, Virtuemart e opção default

Recentemente tenho estado a colocar on-line uma loja de nome Estética Online e para isso utilizei o CMS Joomla 1.0.12 com um plugin chamado Virtuemart 1.0.10, para além de vários outros mas para o caso interessa este.
Em todos os produtos que foram colocados na loja, por uma questão de coerência foi sempre colocado o formato do produto como atributo numa caixa de texto descrita no backoffice da versão portuguesa do Virtuemart como "Lista de atributos". Isto colocou um problema. Mesmo os produtos que só tinham um formato disponível e portanto só tinham uma opção nessa lista de atributos não podiam ser comprados directamente já que o Virtuemart obrigava a que se entrasse na página de detalhe do produto e se escolhesse uma opção e isto iria baralhar muitos utilizadores.
Pelo que andei a investigar não existe nenhuma solução disponível pelo que publico aqui o que fiz para solucionar este problema.
A solução que me interessava era fazer com que a primeira opção da lista fosse a escolhida por omissão, já que esta correspondia ao preço default apresentado. O facto de, mesmo quando há várias opções, existir um formato por omissão não é problemático já que no carrinho de compras aparece o formato que foi escolhido dando assim hipótese de o utilizador rever o formato caso deseje outro.
Para conseguir esta solução foi necessário fazer uma alteração simples Num ficheiro do virtuemart. O ficheiro a alterar é o seguinte:

[siteroot]/administrator/components/com_virtuemart/classes/ps_cart.php

Na linha 134 desse ficheiro, imediatamente antes do seguinte pedaço de código:

if ( ($result["attribute_given"] == false && !empty( $result["advanced_attribute_list"] ))
|| ($result["custom_attribute_given"] == false && !empty( $result["custom_attribute_list"] )) ) {
    $_REQUEST['flypage'] = ps_product::get_flypage($product_id);
    $GLOBALS['page'] = 'shop.product_details';
    $vmLogger->tip( $VM_LANG->_PHPSHOP_CART_SELECT_ITEM );
    return true;
}


Coloquei o seguinte código:

if($result['attribute_given'] == false) {
    $result['attribute_given'] = true;
    $dummy = explode(",", $result['advanced_attribute_list']);
    $d['description'] = $dummy[1];
}


Foi uma solução simples e que até agora parece estar a funcionar, creio que como a opção escolhida é a primeira é possível que bastasse colocar o attribute_given a true, para outra opção default que não a primeira penso que se terá que mudar mais atributos e não só a descrição. Aconselho sempre a fazer uma cópia do ficheiro original e a colocar bem visível um comentário a indicar o início e o fim das alterações.

PS: Confesso que devido aos meus hábitos de python e perl ainda tentei fazer as duas últimas linhas numa só, assim:

$d['description'] = explode(",", $result['advanced_attribute_list'])[1];

mas o PHP não é assim tão à frente.

Sem comentários: