2008-03 Archive

Films op FiViKASKA.be

2008-03-19 - Nederlands, Notes, WordPress - Reply

Na een paar serieuze programmeersessies staan er eindelijk films op de website van mijn school, FiViKASKA.be. Allen daarheen dus.

‘t Heeft wel wat zweet gekost en ik ben ook niet zo zeker meer of de volgende iteratie van benderydt.com nog wel op WordPress zal draaien, maar dat zijn zorgen voor later. Als Django nu eens op shared webhosts zou draaien…

Kort gesteld ben ik de volgende vervelende zaken tegengekomen:

  1. Het is veel te moeilijk om WordPress’ admin scherm uit te breiden om een nieuw gegevenstype aan te maken. Ondanks alle hooks en filters kan je bijna niets veranderen aan wordpress/wp-admin/post.php, de plaats waar je nieuwe berichten ingeeft. Ik heb bijna de hele post.php-interface moeten dupliceren om daar een hoop dingen aan te kunnen toevoegen.
  2. Niets nieuws onder de zon, maar PHP is af en toe echt wel braindead. Kijk bijvoorbeeld naar deze tabel en probeer eens op één, twee, drie te bedenken hoe je test of er iets in een stringvariabele zit. if ($string)? Nope, dit faalt wanneer de string de waarde "0" bevat. if (isset($string))? Nee, want een lege string geeft ook TRUE bij isset. if (! empty($string))? Zelfde verhaal als bij if ($string), "0" geeft een vals negatief. De oplossing is if (strlen($string)) of if ($string !== ''). Intuïtief, nietwaar?
  3. WordPress heeft de abjecte en bijna misdadige gewoonte om bij aanvang van een request alle POST en GET variabelen te quoten zodat ze veilig in de databank kunnen weggeschreven worden. Abject omdat je telkens je iets met die variabelen wil doen ze moet ont-quoten om ze daarna terug te quoten. Bijna misdadig omdat core WordPress-functies als wp_insert_post niet meer checken of de input nog ge-quote-d moet worden, maar blindelings alles in de database dumpen, zelfs zonder foutboodschappen te checken (#6227). Dit wil zeggen dat eender welke plugin die deze functie(s) gebruikt zonder de input te quoten, een rechtstreekse input naar de database geeft. Denk aan input als hallo '; DROP DATABASE; en je database is weg. (WordPress core is OK omdat ze alles quoten.)

Daar staat tegenover dat, als het werkt, de admin-schermen van WordPress ook voor een leek bruikbaar zijn, en daar was het tenslotte allemaal om begonnen.

Pretty smart (wp_redirect problem)

2008-03-06 - Notes, WordPress - Reply

While developing a WordPress plugin I stumbled upon the following annoying problem:

My plugin consists of several interlinked pages with forms on them, like a wizzard. They’re integrated into the WordPress admin environment by means of the handy add_menu_page and add_submenu_page-functions. I want to check the result of the forms and advance the user to the next page using wp_redirect whenever I have sufficient input. Pretty easy for a standalone php webpage: check the $_POST-array, do whatever you have to do and redirect the browser to the next page when you’re satisfied before outputting any html (not even a space or carriage return).

However, my pages are never called directly. They exist inside WordPress’ admin.php page, and admin.php outputs the top part of the page before my code is even called. This means that the HTTP-redirect will always fail. You simply cannot send HTTP-Headers somewhere in the middle of the HTTP-body (i.e. the actual html).

Thinking about it, I thought I had two options:

  1. hook into WordPress’ init or send_headers hooks. These are called before any html-output.
  2. call my php-files directly in the forms action and replicate all admin.php-code inside them.

I didn’t like the first option ’cause init or send_headers are called for every pageview, and I’d have to find out whether the request originated from one of my forms. Plus I’d have to seperate all application logic in one central place, away from the actual pages. I didn’t like the second option ’cause I’d have to track the WordPress core pretty tightly to make sure none of my replicated code contained any newfound WordPress bugs. However, upon inspecting admin.php, I found a third option.

admin.php won’t output anything if you call your plugin page with an optional &noheader GET argument, but it will setup the whole WordPress environment for you. I’m quite happy: all I have to do is change my forms action from this

<form method="post" action="admin.php?page=your_plugin_page.php">

to this

<form method="post" action="admin.php?page=your_plugin_page.php&noheader">

and I can redirect to my hearts content. You can make it draw the menu with this bit of code:

/* this strange thing makes WordPress output the admin header whenever we need it
   we turn the header off with "&noheader" so we can redirect with WP_Redirect
*/
if (isset($_GET['noheader']))
	require_once(ABSPATH . ‘wp-admin/admin-header.php’);

after you’ve done your validation and possible redirection.

Cantor Middernachtzon

2008-03-05 - Equipment, Middernachtzon, Nederlands, Theater - Reply

Onze schatjes zijn er nog eens in geslaagd om op het laatste moment een heroïsch effort te doen zodat het toneelstuk toch nog op zijn poten kwam. ‘t Was nodig want de nacht na de generale heb ik niet geslapen. Gelukkig waren de voorstellingen veel beter en het publiek was goed mee. Een pluim voor de strontvliegen en een welgemeende dankuwel voor alle aanwezigen.

adb cantorSpijtig genoeg zijn we tijdens de voorstelling van zaterdag nog eens geplaagd door de ADB Cantor-ziekte. Voor de leken onder U, de ADB Cantor is een kleine lichttafel die door heel veel theaters en culturele centra in België gebruikt wordt. Wij gebruiken ze nu al voor de 5de keer en keer op keer hebben we problemen met de tafel. Onze problemen zijn telkens weer op hetzelfde terug te brengen: de tafel is niet gebruiksvriendelijk voor mensen die niet dag in dag uit met belichting bezig zijn, en zonder manual is ze niet bruikbaar. Probeer bv. maar eens zonder manual te vinden hoe je de tafel weer naar maagdelijke toestand moet resetten.

Het probleem van zaterdagavond was simpelweg terug te brengen tot een ontbrekende cancel-knop. Tijdens de eerste scene na de pauze stond opeens de LIMIT-knop te pinken (waarschijnlijk heeft één of andere snodaard tijdens de pauze op wat toetsen gedrukt). Deze LIMIT-knop dient om kanalen te limiteren naar een bepaalde lichtsterkte, om bijvoorbeeld in alle lichtstanden een meer uitgebalanceerde belichting te bekomen. Het effect van de LIMIT-knop is dat hij de lampen limiteert op de lichtsterkte van de ingeschakelde lampen op dat moment, in ons geval dus de lichtstand van de eerste setting na de pauze. Concreet wou dit zeggen dat we van de 21 kanalen er maar 12 meer ter beschikking hadden (de rest was gelimiteerd op nul) en dat het tweede deel van het toneelstuk qua belichting op zijn minst mager was.

Dit probleem zou snel opgelost geweest zijn moesten we de LIMIT-actie hebben kunnen cancelen, maar de enige manier om van die LIMIT-toestand vanaf te raken is blijkbaar alle lampen op volle sterkte aan te zetten. Ten eerste is dit niet echt wat je wil in een live-theater productie en ten tweede hebben we dat pas nadien in de manual terug gevonden. Ik weet wel, veel valt terug te brengen op onze onwetendheid (ik weet bijvoorbeeld niet waarom we juist die tafel gebruiken), maar toch kan ik niet nalaten volgende opmerkingen te maken:

  1. Waarom is er geen grote cancel-knop om destructieve acties teniet te doen?
  2. Waarom kan de tafel niet in 2 modi werken, een setup-modus om te programmeren en een live-modus waar je niks aan de programmatie kan veranderen? Het zou de helft van onze problemen oplossen. Ik zie niet bijvoorbeeld in waarom je tijdens een productie ten alle tijde moet kunnen patchen (kanalen hernummeren) of kanalen limiteren.
  3. Waarom kan je niet de delen van de tafel afzetten die je niet nodig hebt? Bv. looplichten / automatische lichtscene wissels?

Afin, volgende keer heb ik de manual wel gelezen. Of misschien een andere lichttafel. Voor alle duidelijkheid, ik ben niet de lichtman, Bob kan dat veel beter (Hai Bob!).