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')]
Fine tune node permissions
The default CRUD + view operations on nodes can be fine tuned by using
Change hook order
Different implementations of the same hook execute in an order based on the weight value in the system table then the alphabetical order. You can change the order by updating the weight in the db but it could be more fine tuned to just change the hook order by using hook_module_implements_alter().
Ajax / Json
How-to simply update a piece of content on click with Jquery?
in your .module file
Extract page content while simple testing with xpath and DOM
It is sometimes useful to grab content from the page that is currently tested. The idea is to search for the tag with xpath then convert it to DOM to get data... For instance, let's get the title and the href value of the second tab.
Import an external file
file_save_data does (almost) all the job for us and drupal_http_request allows to get the file even through a proxy.
Programmatically redirect
There is a drupal function ready to use to redirect called drupal_goto();
but this function does a direct redirection and sometimes it is useful to let Drupal continue doing his stuff by setting $_GET['destination'] instead
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:
Create a csv file
this is php code using Drupal file stream
Dependent field in views plugin
When building views plugin it is better to use ctools #dependency property than #state FAPI
- 1 of 5
- next ›