Archive for the ‘osCommerce programming’ Category

Correcting “USU5 could not find a valid base filename, please inform the developer. in …”

Tuesday, July 27th, 2010

I upgraded this osCommerce contribution after finding a small bug, and got this error while running an utility I wrote.

For a better explanation, I usually write scripts to help updating the store, cleaning databases, or even generating google sitemaps, but keep these scripts is a subdirectory of  the main script, to avoid messing too much and forgetting to delete potentially dangerous scripts.

So, when I was trying to run to insert a new option to a batch of products, I had this error displayed:

"Warning:  USU5 could not find a valid base filename, please  inform the developer. in ..."

Sure enough, this “bug” was located in the file application_top.php, in a new function added in r119. As the problem is due to this script’s location being outside the main dir, the solution was quite simple.  I added a few lines checking if the directory in use is different from the catalog’s dir, and simply returned a correct value overriding the function. In other words:

Locate in includes/application_top.php the lines

        /**
	* USU5 function to return the base filename
	*/
	function usu5_base_filename() {
		// Probably won't get past SCRIPT_NAME unless this is reporting cgi location
		$base = new ArrayIterator( array( 'SCRIPT_NAME', 'PHP_SELF', 'REQUEST_URI', 'ORIG_PATH_INFO', 'HTTP_X_ORIGINAL_URL', 'HTTP_X_REWRITE_URL' ) );
		while ( $base->valid() ) {
			if ( array_key_exists(  $base->current(), $_SERVER ) && !empty(  $_SERVER[$base->current()] ) ) {
				if ( false !== strpos( $_SERVER[$base->current()], '.php' ) ) {
					preg_match( '@[a-z0-9_]+\.php@i', $_SERVER[$base->current()], $matches );
					if ( is_array( $matches ) && ( array_key_exists( 0, $matches ) )
																		&& ( substr( $matches[0], -4, 4 ) == '.php' )
																		&& ( is_readable( $matches[0] ) || ( false !== strpos( $_SERVER[$base->current()], 'ext/modules/' ) ) ) ) {
						return $matches[0];
					}
				}
			}
			$base->next();
		}
		// Some odd server set ups return / for SCRIPT_NAME and PHP_SELF when accessed as mysite.com (no index.php) where they usually return /index.php
		if ( ( $_SERVER['SCRIPT_NAME'] == '/' ) || ( $_SERVER['PHP_SELF'] == '/' ) ) {
			return 'index.php';
		}
		trigger_error( 'USU5 could not find a valid base filename, please inform the developer.', E_USER_WARNING );
	} // End function
// set php_self in the local scope
	$PHP_SELF = usu5_base_filename();

and change for

        /**
	* USU5 function to return the base filename
	*/
	function usu5_base_filename() {
		// Probably won't get past SCRIPT_NAME unless this is reporting cgi location
		$base = new ArrayIterator( array( 'SCRIPT_NAME', 'PHP_SELF', 'REQUEST_URI', 'ORIG_PATH_INFO', 'HTTP_X_ORIGINAL_URL', 'HTTP_X_REWRITE_URL' ) );
		while ( $base->valid() ) {
			if ( array_key_exists(  $base->current(), $_SERVER ) && !empty(  $_SERVER[$base->current()] ) ) {
				if ( false !== strpos( $_SERVER[$base->current()], '.php' ) ) {
					// ignore processing if this script is not running in the catalog directory
					if( dirname($_SERVER[$base->current()]).'/' != DIR_WS_CATALOG){
						return $_SERVER[$base->current()];
					}
					preg_match( '@[a-z0-9_]+\.php@i', $_SERVER[$base->current()], $matches );
					if ( is_array( $matches ) && ( array_key_exists( 0, $matches ) )
																		&& ( substr( $matches[0], -4, 4 ) == '.php' )
																		&& ( is_readable( $matches[0] ) || ( false !== strpos( $_SERVER[$base->current()], 'ext/modules/' ) ) ) ) {
						return $matches[0];
					}
				}
			}
			$base->next();
		}
		// Some odd server set ups return / for SCRIPT_NAME and PHP_SELF when accessed as mysite.com (no index.php) where they usually return /index.php
		if ( ( $_SERVER['SCRIPT_NAME'] == '/' ) || ( $_SERVER['PHP_SELF'] == '/' ) ) {
			return 'index.php';
		}
		trigger_error( 'USU5 could not find a valid base filename, please inform the developer.', E_USER_WARNING );
	} // End function
// set php_self in the local scope
	$PHP_SELF = usu5_base_filename();
 
Let me know if yout tried this modification.

módulo Pagseguro para osCommerce 3

Monday, October 26th, 2009

Aproveitando que escrevi sobre um erro muito comum do módulo escrito por mim para a Pagseguro, resolvi colocar algumas considerações sobre o futuro desse módulo.

A loja osCommerce 3 está em forma de release candidate (RC5, se não me engano agora), o que faz algumas pessoas estarem tentando testá-la.
O módulo existente do Pagseguro não funcionará com essa versão, pois as classes necessárias para isso foram modificadas, o que faz o módulo antigo simplesmente não se comunicar com os servidores da Pagseguro.
Não há previsão nossa para desenvolvermos um modulo gratuitamente para o osCommerce. Caso alguma empresa se interesse em patrocinar o desenvolvimento / atualização do módulo, estamos abertos a propostas.

Além disso, sobre os módulos existentes:

O módulo desenvolvido pela empresa Visie modifica o core da loja, fazendo com que os métodos de cálculo de frete da loja sejam ignorados em favor do cálculo de frete para Pagseguro (apenas Sedex e PAC). Toda loja que precisa de outras formas de frete (como transportadora, frete fixo, internacional, etc) não funcionam com esse módulo corretamente.

O módulo que está com minha assinatura e é distribuído hoje não tem suporte para a atualização automática do pedido, coisa que para algumas lojas é muito importante, como as lojas de venda de produtos digitais (scrapbooking / apostilas / livros / músicas / outros downloads). Esse suporte existe hoje em nossas lojas ecartgt e mais algumas outras lojas.
(Infelizmente, uma empresa teve acesso a nosso módulo em uma loja de scrapbooking e passou a vender o módulo modificado para o ZenCart. Não temos nenhum vínculo com essa empresa e portanto não respondemos nenhum pedido de suporte para esse módulo)

Atualizarei este post no futuro com mais informações. Se você tiver outras perguntas, por favor coloque-as nos comentários.

pagseguro: “O campo ITEM_VALOR_0 deve ser numérico”

Monday, October 26th, 2009

Recebo dezenas de perguntas sobre isso, e não há uma solução de terceiros para esse erro, o que é MUITO estranho.

Esse erro ocorreo simplesmente porque o módulo foi projetado para funcionar com múltiplas moedas, enquanto o Pagseguro só funciona com uma (Reais por enquanto).

A solução é simples: acesse a configuração do MÖDULO e modifique o campo “moeda usada no Brasil” para o código usado pelo real em sua loja. Pode ser qualquer código, desde que seja exatamente igual o que você já usa.

Com isso, o módulo vai funcionar corretamente de imediato.

Aproveite e veja meu site: www.ecartgt.com.br

oscommerce’s paypal module problem with downloads

Sunday, May 31st, 2009

I struggled a lapse of time today because my new customer’s store was delivering downloadable products for pending orders, using the standard_ipn module made for oscommerce rc1.

The whole problem is that the original Paypal_ipn module for oscommerce (since version 2.2 MS2 as far as I could track) DOES NOT  have an option to changes statuses when an order was approved (completed).

It simply have two statuses: Preparing (before the customer went to the Paypal gateway) and Acknowledged (after the customer returned from the gateway). So, this customer’s module was set to change the order’s status to “download available” when the module was just saying “Acknowledged”.

The fix: add a new setting to the module and edit the file ext/modules/payment/paypal/standard_ipn.php to account this new order status.

(if you don’t know what I mean, hire a good programmer to do it for you or contact me and I can help you for a small fee.)