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:
$dom = new DOMDocument(); @$dom->loadHTML($html); $xpath = new DOMXPath($dom);
to get the text inside of a particular tag
$text = $result->item(0)->nodeValue // or easier $xpath->query("//div[@id='my_id']/text()");
to get id's of items with a specific class
foreach($results as $result) { $id= $result->getAttribute('id'); }
to extract whole DOM html
$result= $this->xpath("//body"); $body = $dom->saveHTML($result->item(0)); //or easier $result= $this->xpath("//body/node()");
FOR UNIT TESTING
to test if link inside of a specific tag exists
$this->xpath("//div[@id='my_id']//a[contains(@href, 'my_link')]");
to test a div containing a string
// exact text $this->xpath("//div[contains(@class, 'views-field-field-vintage')]/div[.='2010']"); // containing text $this->xpath("//div[contains(@class, 'views-field-field-vintage')]/span[contains(., '2010')]");
to test the nth item
//this checks that inside the 3rd image field is an image of 70 width with style my_style_preset $this->xpath("(//td[contains(@class, 'views-field-field-singleimage')])[3]/img[@width=70 and contains(@src, '/styles/my_style_preset/')]"); // do not forget the parenthesis
some complex stuff
"//td[contains(@class, 'xl7717818') or contains(@class, 'xl6717818') or contains(@class, 'xl7817818') or contains(@class, 'xl7917818')][text()!='A']/../following-sibling::tr[contains(@height, 20)]" // 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
preceding-sibling::tr[1]/td[position()>2 and position()<5] // move to the previous tr then get all the td in position 3 and 4
tag that contains some text
//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...)
- ‹ previous
- 4 of 5
- next ›