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')]
override a default .tpl.php file in a custom module
to basically use a template file in a custom module use the hook_theme_registry_alter(&$theme_registry) like this
Testing date fields: strtotime tips
Unit testing the creation of a node with a date field could fail because of wrong interpretation of the date by strtotime function
Enable block
There is no available API to programmatically set a block. Like Drupal core does, we have to use db directly.
simpletest: count checkboxes checked
Sometimes it is useful to know exactly the amount of options enabled with a xpath expression
Add a conditional stylesheet for IE
the options of drupal_add_css allow the use of conditional stylesheets
debug drush (and php-cli)
Drush uses the cli version of php so traditional debugging tools and functions don't work.
Create an image style
to create in code, programmatically an image style (previously called image cache preset)
Current path alias
to get the current page alias path use
Unset core stylesheet in a custom theme
by using use hook_css_alter() in template.php
- ‹ previous
- 2 of 5
- next ›