xpath examples & domxpath use with drupal

When the wonderful Feeds module can not be used it is useful to know how to use domxpath and to write queries.
usage:

  1. $dom = new DOMDocument();
  2. @$dom->loadHTML($html);
  3. $xpath = new DOMXPath($dom);

to get the text inside of a particular tag

  1. $result = $xpath->query("//div[@id='my_id']");
  2. $text = $result->item(0)->nodeValue
  3. // or easier $xpath->query("//div[@id='my_id']/text()");

to get id's of items with a specific class

  1. $results = $xpath->query("//div[contains(@class,'my_class')]");
  2. foreach($results as $result) {
  3. $id= $result->getAttribute('id');
  4. }

to extract whole DOM html

  1. $result= $this->xpath("//body");
  2. $body = $dom->saveHTML($result->item(0));
  3. //or easier $result= $this->xpath("//body/node()");

FOR UNIT TESTING
to test if link inside of a specific tag exists

  1. $this->xpath("//div[@id='my_id']//a[contains(@href, 'my_link')]");

to test a div containing a string

  1. // exact text
  2. $this->xpath("//div[contains(@class, 'views-field-field-vintage')]/div[.='2010']");
  3. // containing text
  4. $this->xpath("//div[contains(@class, 'views-field-field-vintage')]/span[contains(., '2010')]");

to test the nth item

  1. //this checks that inside the 3rd image field is an image of 70 width with style my_style_preset
  2. $this->xpath("(//td[contains(@class, 'views-field-field-singleimage')])[3]/img[@width=70 and contains(@src, '/styles/my_style_preset/')]");
  3. // do not forget the parenthesis

some complex stuff

  1. "//td[contains(@class, 'xl7717818') or contains(@class, 'xl6717818') or contains(@class, 'xl7817818') or contains(@class, 'xl7917818')][text()!='A']/../following-sibling::tr[contains(@height, 20)]"
  2. // td OR condition and td does not have "A" text then 1 level up in the dom (to the tr tag) then select the next tr that has an height attribute of 20

traversing + position

  1. preceding-sibling::tr[1]/td[position()>2 and position()<5]
  2. // move to the previous tr then get all the td in position 3 and 4

tag that contains some text

  1. //td[contains(., 'Division')]

Display errors - WSOD

The bootstrap override the values you could set to display error ad the reporting level. To be 100% sure everything is printed out when something fails in a blank screen (wsod), make index.php like this:

Properly render a field

Drupal offers a few (sometimes complicated...) solutions to output a field. Lets take an example with a date field.
To display the full rendered field: field_view_field()

Using once()

ensure ajax reload don't apply the behaviours for items already processed

Change the theme

Programmatically change the theme on runtime by implementing hook_custom_theme()

Manually clear caches

for views and panels

Add a Jquery ui library

get the library names to use in /misc/ui folder

Embed a custom page

Get the rendered output of a custom page created with page manager (ctools) module

Embed a mini panel

Get the html output of a mini-panel

alter / automatize the install process

in the .profile file of the install profile (here "mysnippet" profile)

Aegir: perform custom tasks after a new site is installed

in a custom module, in a file called mysnippet.drush.inc (keep in mind that the install process is handled by drush...)