Archief van May 2012

Drupal 7 tabs (klasse toevoegen)

Wednesday, 2 May 2012

Soms zijn er zo van die dagen waarop je letterlijk uren verschijt (pardon my French) om simpele zaken op te lossen. Stel bijvoorbeeld dat je, gewoon omdat je absoluut met bootstrap wil werken, een klasse wil toevoegen aan Drupal tabs. Gewoon. Een klasse toevoegen.

Geen probleem, we zoeken onze template.php op en typen naar hartelust: (bron: http://drupal.org/node/173880)

function MYTHEME_menu_local_tasks() {
$output = '';
if ($primary = menu_local_tasks()) {
    $output .= "<ul class=\"tabs primary nav nav-tabs\">\n"
    $output .= $primary;
    $output .= "</ul>\n";
}
return $output;
}

Oeps! render($tabs); die in onze page.tpl.php normaal voor onze tabs zou moeten zorgen geeft ons doodleuk “array” terug als resultaat.

We ontmoeten Google, onze goede vriend in tijden van crisis en problemen, en ontdekken dat drupal_render($output) zowaar een mirakeloplossing is. (bron: http://drupal.org/node/986290)
Testen die handel! En jawel hoor, dat doet het…. tot je effectief ook klikt op de netjes van de juiste klasse voorziene tabs. Oeps 2!

    Warning: Invalid argument supplied for foreach() in element_children() (regel 6244 van /Users/..xxx../includes/common.inc).
    Warning: Cannot use a scalar value as an array in drupal_render() (regel 5723 van /Users/..xxx../includes/common.inc).
    Warning: Cannot use a scalar value as an array in drupal_render() (regel 5778 van /Users/..xxx../includes/common.inc).

Een error kleurt ons scherm rood en dat wil nu eenmaal zeggen: niet goed!

Terug op zoek. En deze keer werkt het wel. In je page.tpl.php laat je gewoon die render($tabs) staan en in template.php voeg je volgende code toe: (bron: http://drupal.org/project/basic )

function MYTHEME_menu_local_tasks(&$variables) {
$output = '';
if (!empty($variables['primary'])) {
$variables['primary']['#prefix'] = '<h2>' . t('Primary tabs') . '</h2>';
$variables['primary']['#prefix'] .= '<ul class="nav nav-tabs tabs primary clearfix">';
$variables['primary']['#suffix'] = '</ul>';
$output .= drupal_render($variables['primary']);
}
if (!empty($variables['secondary'])) {
$variables['secondary']['#prefix'] = '<h2>' . t('Secondary tabs') . '</h2>';
$variables['secondary']['#prefix'] .= '<ul>';
$variables['secondary']['#suffix'] = '</ul>';
$output .= drupal_render($variables['secondary']);
}
return $output;
}

waar MYTHEME uiteraard vervangen moet worden door de naam van je theme.

Voila, u heeft zonet uren zoekplezier bespaard. 😉


Digest access authentication in Titanium

Tuesday, 15 May 2012

Blijkbaar is veiligheid geen prioriteit bij appcelerator en implementeren ze wel basic authentication maar geen digest…
Iemand heeft hen dat ooit al wel eens gezegd bij wijze van feature request maar de priority daarvoor is “low”.
Eitherway, dan maar zelf proberen op te lossen:

	// Let's try to make a connection
	var request = Titanium.Network.createHTTPClient();
	
	request.onload = function() {
		// Because we're using digest authentication
		// we won't get anything here yet
		// but getting a 401 error instead
	};

	request.onerror = function(e) {
		Titanium.API.info("IN 'normal' ERROR: " + JSON.stringify(e));
		if (this.status == 401) {
			wwwAuthString = "" + this.getResponseHeader("WWW-Authenticate");
			// Get all www-Authenticate from the header
			var wwwAuthArray = Array();
			wwwAuthArray = wwwAuthString.split(",");
			var nonceArray = Array();
			// Get the nonce part
			nonce = "" + wwwAuthArray[2];
			// And get rid of nonce=
			nonceArray = nonce.split('"'); // split on "
			nonce = nonceArray[1]; 
			Ti.API.info('nonce = ' + nonce);
			
			// And try again
			var req2 = Titanium.Network.createHTTPClient();
			req2.onload = function(e) {
				alert("SUCCES!: " + JSON.stringify(e));
				Titanium.API.info("In success mode: " + this.responseText);
				// DO SOME OTHER STUFF	
			};
			req2.onerror = function(e) {
				alert("ERROR req2 " + e.error);
			}
			req2.setTimeout(10);
			req2.setRequestHeader("Content-Type","application/json");
			// open the client
			req2.open('GET', 'http://host.tld/path');
			// Populate all vars for digest authentication
			var realm = "REST API";
			var uri = "/path";
			var qop = "auth";
			var nc = '00000002'; // This shouldn't be a fixed value
			var cnonce = "0a4f113b"; // Idem ditto
			var A1 = Ti.Utils.md5HexDigest('username' + ':' + realm + 'password');
			var A2 = Ti.Utils.md5HexDigest('GET'+':'+ uri);
			var resp = Ti.Utils.md5HexDigest(A1 + ':' + nonce + ':' + nc + ':' + cnonce + ':' + qop + ':' + A2 );
			// Add authentication'
			var authstr = 'Digest ' + resp; 
			req2.setRequestHeader('Authorization', authstr);
			// send the data
			req2.send();
		}
	};
	
	request.setTimeout(10);
	request.setRequestHeader("Content-Type","application/json");
	// open the client
	request.open('GET', 'http://host.tld/path');
	// send the data
	request.send();

Ik ben er in geslaagd data van de server terug te krijgen die noodzakelijk is voor digest authentication, maar wanneer ik die data naar de server terugstuur loopt het mis en krijg ik alsnog een error. Moest je toevallig een oplossing hiervoor hebben of deze code verder uitpluizen: Let me know 😉