cem Fri Mar 24 15:46:38 2006 UTC
Modified files:
/phpdoc/en/reference/sdo reference.xml
Log:
Updates for 1.0 release
http://cvs.php.net/viewcvs.cgi/phpdoc/en/reference/sdo/reference.xml?r1=1.21&r2=1.22&diff_format=u
Index: phpdoc/en/reference/sdo/reference.xml
diff -u phpdoc/en/reference/sdo/reference.xml:1.21
phpdoc/en/reference/sdo/reference.xml:1.22
--- phpdoc/en/reference/sdo/reference.xml:1.21 Fri Feb 24 18:36:41 2006
+++ phpdoc/en/reference/sdo/reference.xml Fri Mar 24 15:46:38 2006
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='iso-8859-1'?>
-<!-- $Revision: 1.21 $ -->
+<!-- $Revision: 1.22 $ -->
<!-- Purpose: database.abstract -->
<!-- Membership: pecl -->
<!-- State: experimental -->
@@ -10,12 +10,7 @@
<partintro>
<section id="sdo.intro">
- &reftitle.intro;
- <para>
- <!-- This warns that the extension is experimental -->
- &warn.experimental;
- </para>
-
+ &reftitle.intro;
<para>
Service Data Objects (SDOs) enable PHP applications to work with
data from different sources (like a database query, an XML file,
@@ -28,7 +23,7 @@
instance that represents some data in the data source. You can then
set and get values in the SDO instance using the standard SDO
interface. Finally, you use a DAS to write the modified data back
- to a data source (typically the same one).
+ to a data source, typically the same one.
</para>
<para>
See the
@@ -40,10 +35,10 @@
Access Services Interface</link> for more details).
</para>
<para>
- This extension is derived from concepts taken from the
- <ulink url='&url.ibm.sdo;'>
- Service Data Objects specification
- </ulink>
+ This extension is derived from concepts taken from the
+ <ulink url="&url.ibm.sdo;">Service Data Objects specification</ulink>.
+ It includes a version of the
+ <ulink url="&url.apache.tuscany;">Apache Tuscany</ulink> SDO 2.0 for C++
project.
</para>
<section id="sdo.intro.structure">
@@ -54,16 +49,10 @@
objects. For example, a Company data object might consist of a number
of Department data objects and therefore the Company would have
a containment relationship to the Departments.
- Deleting a data object which has a containment relationship to another
- data object will also delete the contained data object. For example,
- deleting the Company data object will also delete the Departments.
</para>
- <para>
- An SDO may also have non-containment references between data objects
- in the tree. For example, one Employee data object might reference
- another Employee to identify a career mentor. Deleting a data object
- which has a non-containment reference to another data object does
- not delete the referenced data object.
+ <para> An SDO may also have non-containment references between data
objects in the
+ tree. For example, one Employee data object might reference another
Employee to
+ identify a career mentor.
</para>
<para>
As well as data objects referencing each other, they can also have
@@ -71,187 +60,115 @@
have a property called "name" of type string, for holding the name
of the company (for example, "Acme").
</para>
+ <para> Each of these properties of a data object - containment
relationships,
+ non-containment references, or primitive properties - may be many-valued
or
+ single-valued. In the above examples, Departments is many-valued and
+ the Company name is single-valued.
+ </para>
+ <para> In PHP, each SDO data object is represented as a PHP object. The
properties of the
+ data object can be accessed using either object syntax or associative
array syntax.
+ We'll see some examples of this later.
+ </para>
</section>
</section>
<section id="sdo.requirements">
&reftitle.required;
- <para>
- The SDO extension requires PHP 5.1 or higher.
- </para>
- <para>
- SDO <link linkend="ref.sdo-das-xml">XML Data Access Service</link>,
- which is built as part of this extension, requires libxml2
- (Tested with libxml2 2.6.19) which can be downloaded from
+ <para> The SDO extension requires PHP 5.1 or higher. It also requires the
libxml2 library.
+ Normally libxml2 will already be installed, but if not, it can be
downloaded from
<ulink url='&url.libxml;'>&url.libxml;</ulink>.
</para>
</section>
<section id="sdo.installation">
&reftitle.install;
- <para>
- There are several options, depending on whether you are installing on
- Windows or Linux, and depending on whether you are installing a released
- version (a .tgz file from the PECL site) or the latest from CVS.
- The Relational DAS also needs special attention as it is written in
- PHP.
- </para>
- <para> The instructions are likely to change as PHP 5.1 progresses in
status from beta to
- stable release. The instructions here were correct on 6th October 2005,
when PHP
- 5.1.0RC1 was the current release candidate for PHP, and 0.5.2 was the
current beta
- release of SDO.
- </para>
- <para>
- The options are summarised in the following table:
- <informaltable>
- <tgroup cols='3'>
- <thead>
- <row>
- <entry>latest/Release</entry>
- <entry>Windows</entry>
- <entry>Linux</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>
- latest CVS
- </entry>
- <entry>
- <itemizedlist>
- <listitem>
- <para>
- The latest DLLs for the SDO core and the XML DAS can be
- downloaded from
- <ulink url='&url.pecl.win.ext;php_sdo.dll'>php_sdo</ulink> and
- <ulink url='&url.pecl.win.ext;php_sdo_das_xml.dll'>php_sdo_das_xml
- </ulink> respectively.
- </para>
- </listitem>
- <listitem>
- <para>
- Check out the Relational DAS from CVS to somewhere on the
- PHP
- <link linkend="ini.include-path">include_path</link>.
- </para>
- </listitem>
- </itemizedlist>
- </entry>
- <entry>
- <itemizedlist>
- <listitem>
- <para>
- Check out the SDO core and the XML DAS from CVS
- and build according to the instructions
- below for building on Linux.
- </para>
- </listitem>
- <listitem>
- <para>
- Check out the Relational DAS from CVS to somewhere on the
- PHP
- <link linkend="ini.include-path">include_path</link>.
- </para>
- </listitem>
- </itemizedlist>
- </entry>
- </row>
- <row>
- <entry>
- Release
- </entry>
- <entry>
- <itemizedlist>
- <listitem>
- <para>
- There is currently no way provided for building the release
- version of the SDO core and XML DAS on a user's machine.
- You will only be able to pick up the latest DLLs from the
- snaps site (see previous row of this table).
- </para>
- </listitem>
- <listitem>
- <para>
- The Relational DAS can be downloaded and installed with
- the command:
- </para>
- <para>
- <command>
- pear install -B <package name and level>
- </command>
- </para>
- <para>
- Substitute the desired package name and level, for example
- <varname>sdo-0.5.2</varname>, in the command above.
- </para>
- </listitem>
- </itemizedlist>
- </entry>
- <entry>
- <itemizedlist>
- <listitem>
- <para>
- You can download and install all three SDO components - the
- SDO core, the XML DAS and the Relational DAS - with the
- command:
- </para>
- <para>
- <command>
- pear install <package name and level>
- </command>
- </para>
- <para>
- Substitute the desired package name and level, for example
- <varname>sdo-0.5.2</varname>, in the command above.
- </para>
- <para>
- This command will build the SDO and XML shared libraries as well
- as installing the PHP files that make the Relational DAS.
- </para>
- </listitem>
- </itemizedlist>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
- <para>
- Regardless of which platform or which level of the code you have installed
- you will need add the two extension libraries to your &php.ini; file.
- On Windows, add:
- <programlisting role="php" id="sdo.installation.ini.windows">
-<![CDATA[
-extension=php_sdo.dll
-extension=php_sdo_das_xml.dll
-]]>
- </programlisting>
- On Linux, add:
- <programlisting role="php" id="sdo.installation.ini.linux">
+ <procedure id='sdo.install.unix'>
+ <title>Unix systems</title>
+ <step>
+ <para> You can download and install the latest stable release of all
three SDO
+ components - the SDO core, the XML DAS and the Relational DAS - with
the command:
+ <screen> <![CDATA[
+pear install sdo
+]]>
+ </screen>
+ </para>
+ <para> This command will build the SDO and XML shared libraries as well
as installing
+ the PHP files that make the Relational DAS.
+ </para>
+ <para>
+ If you want to use the latest beta version, then instead run:
+ <screen>
<![CDATA[
+pear install sdo-beta
+]]>
+ </screen>
+ </para>
+ </step>
+ <step>
+ <para> The
+ <command>pear</command> command automatically installs the SDO and
SDO_DAS_XML
+ modules into your PHP extensions directory. To enable the SDO extensions
you must add
+ the following lines to &php.ini;:
+ <screen> <![CDATA[
extension=sdo.so
extension=sdo_das_xml.so
]]>
- </programlisting>
- You may also need to update your
- <link linkend="ini.extension-dir">extension_dir</link>
- in &php.ini; to point to the location of these libraries.
- </para>
+ </screen>
+ </para>
+ <para> For more information about building PECL packages, consult the
+ <link linkend="install.pecl">PECL installation</link> section of the
manual.
+ </para>
+ </step>
+ </procedure>
+
+ <procedure id='sdo.install.win32'>
+ <title>Windows</title>
+ <step>
+ <para>
+ The latest DLLs for the SDO core and the XML DAS can be
+ downloaded from
+ <ulink url='&url.pecl.win.ext;php_sdo.dll'>php_sdo.dll</ulink> and
+ <ulink
url='&url.pecl.win.ext;php_sdo_das_xml.dll'>php_sdo_das_xml.dll</ulink>
respectively.
+ </para>
+ <para>
+ Note that currently the <ulink url='&url.pecl.win;'>pecl4win</ulink>
site does not provide
+ these binaries at the current release level; you can only download the
latest level.
+ </para>
+ </step>
+ <step>
+ <para> The
+ <command>pear</command> command automatically installs the SDO and
SDO_DAS_XML
+ modules into your PHP extensions directory. To enable the SDO extensions
you must add
+ the following lines to &php.ini;:
+ <screen>
+ <![CDATA[
+extension=php_sdo.dll
+extension=php_sdo_das_xml.dll
+]]>
+ </screen>
+ </para>
+ </step>
+ <step>
+ <para> The Relational DAS can be downloaded and installed with the
command:
+ <screen>
+ <![CDATA[
+pear install -B sdo
+]]>
+ </screen>
+ </para>
+ <para> The Relational DAS is written in PHP. You may need to update your
+ <link linkend="ini.include-path">include_path</link> in &php.ini; to
point to
+ the directory that contains
+ <filename>sdo/DAS/Relational</filename>.
+ </para>
+ </step>
+ </procedure>
- <para>
- The Relational DAS is written in PHP. You may need to
- update your
- <link linkend="ini.include-path">include_path</link>
- in &php.ini; to point to the directory that contains
- <filename>sdo/DAS/Relational</filename>.
- </para>
<procedure id='sdo.build.linux.steps'>
<title>Building SDO on Linux</title>
- <para>
- This section describes how to build the SDO core and XML DAS on Linux.
- Currently you would only need to know how to do this if you
- wish to build a recent version that you have checked out
- of CVS.
+ <para> This section describes how to build the SDO core and XML DAS on
Linux. You would
+ only need to know how to do this if you wish to build a recent version
that you have checked
+ out of CVS.
</para>
<step>
<para>
@@ -267,8 +184,8 @@
</step>
<step>
<para>
- Next, run <command>./configure; make; make install</command>. Please
- note, you may need to login as root to install the extension.
+ Next, run <command>./configure; make; make install</command>.
+ Please note, you may need to login as root to install the extension.
</para>
</step>
<step>
@@ -276,7 +193,7 @@
Make sure that these modules are loaded by PHP, by adding
<command>extension=sdo.so</command> and
<command>extension=sdo_das_xml.so</command> to your
- <filename>php.ini</filename> file in the same order.
+ &php.ini; file in the same order.
</para>
</step>
</procedure>
@@ -301,8 +218,7 @@
</entry>
<entry>
An XML Data Access Service supporting reading/writing
- SDOs as XML documents or via a Web URL to supporting things like
- RSS feeds.
+ SDOs as XML documents.
</entry>
</row>
<row>
@@ -311,7 +227,7 @@
</entry>
<entry>
A PDO-based Data Access Service supporting reading/writing SDO
- to relational data sources.
+ to relational databases.
Implements an optimistic concurrency policy for updates.
</entry>
</row>
@@ -331,6 +247,9 @@
<step>
<para>
There is no support for multi-byte character sets.
+ This will be considered, depending on community requirements,
+ in the Unicode-enabled version of PHP.
+ See <link linkend="ref.unicode">Unicode Functions</link>.
</para>
</step>
</procedure>
@@ -344,16 +263,6 @@
</para>
<step>
<para>
- Abstract types and type derivation.
- </para>
- </step>
- <step>
- <para>
- Open types.
- </para>
- </step>
- <step>
- <para>
Bi-directional relationships.
</para>
</step>
@@ -368,13 +277,12 @@
</para>
</step>
<step>
- <para>
- XMLHelper/XSDHelper (the XML DAS provides a lot of this functionality)
- </para>
- </step>
- <step>
- <para>
- TypeHelper (the SDO_DAS_DataFactory provides this functionality)
+ <para>
+ The Helper classes defined in SDO 2.0 are not directly implemented.
+ However equivalent function is provided in a more natural way for PHP.
+ For example the function of <command>CopyHelper::copy()</command>
+ is provided by applying the PHP
+ <link linkend='language.oop5.cloning'>clone</link> keyword to a data
object.
</para>
</step>
</procedure>
@@ -387,14 +295,32 @@
and instance information shown below, using the XML Data Access Service.
</para>
<para>
- The schema describes a company data object.
- The company contains department data objects, and
- each department contains employee data objects.
- Each data object has a number of primitive properties to describe things
- like name, serial number, etc.
- Finally, the company data object also has a non-containment reference
- to one of the employee data objects to identify them as the
- 'employeeOfTheMonth'.
+ The instance document below describes a single company,
+ called 'MegaCorp', which contains a single department,
+ called 'Advanced Technologies'.
+ The Advanced Technologies department contains three employees.
+ The company employeeOfTheMonth is referencing the second employee,
+ 'Jane Doe'.
+ </para>
+ <para>
+ <programlisting role="xml">
+<![CDATA[
+<?xml version="1.0" encoding="UTF-8" ?>
+<company xmlns="companyNS" name="MegaCorp"
+ employeeOfTheMonth="E0003">
+ <departments name="Advanced Technologies" location="NY" number="123">
+ <employees name="John Jones" SN="E0001"/>
+ <employees name="Jane Doe" SN="E0003"/>
+ <employees name="Al Smith" SN="E0004" manager="true"/>
+ </departments>
+</company>
+]]>
+ </programlisting>
+ </para>
+ <para> The root element of the schema is a company. The company contains
departments, and
+ each department contains employees. Each element has a number of
attributes to store
+ things like name, serial number, and so on. Finally, the company also has
an IDREF
+ attribute which identifies one of the employees as the
'employeeOfTheMonth'.
</para>
<para>
<programlisting role="xml">
@@ -409,15 +335,16 @@
<xsd:complexType name="CompanyType">
<xsd:sequence>
<xsd:element name="departments" type="company:DepartmentType"
- maxOccurs="unbounded"/>
+ maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string"/>
<xsd:attribute name="employeeOfTheMonth" type="xsd:IDREF"
-sdoxml:propertyType="company:EmployeeType"/> </xsd:complexType>
+ sdoxml:propertyType="company:EmployeeType"/>
+ </xsd:complexType>
<xsd:complexType name="DepartmentType">
<xsd:sequence>
<xsd:element name="employees" type="company:EmployeeType"
- maxOccurs="unbounded"/>
+ maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string"/>
<xsd:attribute name="location" type="xsd:string"/>
@@ -432,52 +359,32 @@
]]>
</programlisting>
</para>
-
- <para>
- The instance document below describes a single company,
- called 'MegaCorp', which contains a single department,
- called 'Advanced Technologies'.
- The Advanced Technologies department contains three employees.
- The company employeeOfTheMonth is referencing the second employee,
- 'Jane Doe'.
- </para>
-
- <para>
- <programlisting role="xml">
-<![CDATA[
-<?xml version="1.0" encoding="UTF-8" ?>
-<company xmlns="companyNS" name="MegaCorp"
- employeeOfTheMonth="#/departments.0/employees.1">
- <departments name="Advanced Technologies" location="NY" number="123">
- <employees name="John Jones" SN="E0001"/>
- <employees name="Jane Doe" SN="E0003"/>
- <employees name="Al Smith" SN="E0004" manager="true"/>
- </departments>
-</company>
-]]>
- </programlisting>
+ <para>The XML Data Access Service maps the schema to an SDO. Attributes
such as "name"
+ become primitive properties, the sequence of employees becomes a
many-valued
+ containment relationship, and so on. Note that the containment
relationships are
+ expressed as one complex type within another, whereas non-containment
references are
+ expressed in terms of ID and IDREF, with a special
+ <command>sdoxml:propertyType</command> attribute specifying the type of the
+ non-containment reference.
</para>
-
</section>
<section id="sdo.sample.getset">
<title>Setting and Getting Property Values</title>
- <para>
- The following examples assume <command>$company</command> is a data
- object created from the schema and instance document shown above.
+ <para> The following examples assume
+ <command>$company</command> is the root of a tree of data objects created
from the
+ schema and instance document shown above.
</para>
<para>
<example>
- <title>Access via Property names</title>
+ <title>Access via property name</title>
<para>
Data object properties can be accessed using the object property
- access syntax. The following gets the list of departments
- (containing a single department), and sets the company name to 'Acme'.
+ access syntax. The following sets the company name to 'Acme'.
</para>
<programlisting role="php" id="sdo.examples.propname">
<![CDATA[
<?php
- $departments = $company->departments;
$company->name = 'Acme';
?>
]]>
@@ -487,24 +394,16 @@
<para>
<example>
- <title>Access via Property index</title>
- <para>
- Data object properties can be accessed via their property index
- using array syntax. The property index is the position at which the
- property's definition appears in the model (in this case the xml
- schema).
- We can see from the schema listing above that the departments element
- is the first company property defined and the company name attribute
- is the second company property (the SDO interface makes no distinction
- between XML attributes and elements).
- The following gets the list of departments (containing a single
- department), and sets the company name to 'Acme'.
+ <title>Access via property name as array index</title>
+ <para>We can also access properties using associative array syntax. The
simplest
+ form of this uses the property name as the array index. For example, the
following sets
+ the company name and gets the employeeOfTheMonth.
</para>
- <programlisting role="php" id="sdo.examples.propindex">
+ <programlisting role="php" id="sdo.examples.simplexpath">
<![CDATA[
<?php
- $departments = $company[0];
- $company[1] = 'Acme';
+ $company['name'] = 'UltraCorp';
+ $eotm = $company['employeeOfTheMonth'];
?>
]]>
</programlisting>
@@ -513,59 +412,55 @@
<para>
<example>
- <title>Data Object Iteration</title>
+ <title>Data Object iteration</title>
<para>
We can iterate over the properties of a data object using foreach.
- The following iterates over the company properties; name,
- departments and employeeOfTheMonth.
+ The following iterates over the properties of the employee of the month.
</para>
<programlisting role="php" id="sdo.examples.doiter">
<![CDATA[
<?php
- foreach ($company as $name => $value) {
- // ...
+ $eotm = $company->employeeOfTheMonth;
+ foreach ($eotm as $name => $value) {
+ echo "$name: $value\n";
}
?>
]]>
</programlisting>
- <para>
- For the first iteration, $name will be 'name' and $value
- will be 'Acme'. For the second iteration, $name will be
- 'departments' and $value will be an SDO_List (because departments is a
- many-valued property (stated <command>maxOccurs="unbouded"</command>
- in the schema)) containing a single data object of type DepartmentType.
- For the third iteration, $name will be 'employeeOfTheMonth' and $value
- will be a data object of type EmployeeType.
+ <para>
+ which will output:
+ </para>
+ <programlisting id="sdo.examples.doiter-output">
+<![CDATA[
+name: Jane Doe
+SN: E0003
+]]>
+ </programlisting>
+ <para>
+ The 'manager' property is not output, because it has not been set.
</para>
</example>
</para>
-
+
<para>
<example>
- <title>Many-valued Property Iteration</title>
- <para>
- Many-valued properties can also be iterated over using
- foreach. The following iterates over the company's departments.
+ <title>Access many-valued property by name</title>
+ <para> Many-valued data object properties can also be accessed using the
object
+ property name syntax. The following gets the list of departments.
</para>
- <programlisting role="php" id="sdo.examples.mvpiter">
+ <programlisting role="php" id="sdo.examples.mvpname">
<![CDATA[
<?php
- foreach ($company->departments as $department) {
- // ...
- }
+ $departments = $company->departments;
?>
]]>
</programlisting>
- <para>
- Each iteration will assign the next department in the
- list to the variable <command>$department</command>.
- </para>
</example>
</para>
-
+
<para>
<example>
- <title>Many-valued Element Access</title>
+ <title>Many-valued element access</title>
<para>
We can access individual elements of many-valued properties using array
syntax. The following accesses the first department in the company.
@@ -582,98 +477,101 @@
<para>
<example>
- <title>Nested Property Access</title>
+ <title>Many-valued property iteration</title>
<para>
- We can use nested property access to navigate the data object
- instance structure. The following gets and sets the name of the first
- department.
+ Many-valued properties can also be iterated over using
+ foreach. The following iterates over the company's departments.
</para>
- <programlisting role="php" id="sdo.examples.nestedprop">
+ <programlisting role="php" id="sdo.examples.mvpiter">
<![CDATA[
<?php
- $dept_name = $company->departments[0]->name;
- $company->departments[0]->name = 'Emerging Technologies';
+ foreach ($company->departments as $department) {
+ // ...
+ }
?>
]]>
</programlisting>
+ <para>
+ Each iteration will assign the next department in the
+ list to the variable <command>$department</command>.
+ </para>
</example>
</para>
<para>
<example>
- <title>Simple XPath support</title>
- <para>
- We can access properties using XPath-like (an augmented
- sub-set of XPath) expressions, the simplest form of which is the
- property name.
- The following sets the company name and gets the employeeOfTheMonth.
+ <title>Chained property access</title>
+ <para> We can chain property references on a single line.
+ The following sets and gets the name of the first department.
</para>
- <programlisting role="php" id="sdo.examples.simplexpath">
+ <programlisting role="php" id="sdo.examples.nestedprop">
<![CDATA[
<?php
- $company['name'] = 'UltraCorp';
- $eotm = $company['employeeOfTheMonth'];
+ $company->departments[0]->name = 'Emerging Technologies';
+ $dept_name = $company->departments[0]->name;
?>
]]>
</programlisting>
- </example>
- </para>
-
- <para>
- <example>
- <title>Simple XPath support</title>
- <para>
- We can use chained array access calls to navigate the data
- object instance structure. The following gets and sets the name of the
- first department.
- </para>
+ <para>Using the associative array syntax, this is equivalent to</para>
<programlisting role="php" id="sdo.examples.chainarray">
<![CDATA[
<?php
- $dept_name = $company['departments'][0]['name'];
$company['departments'][0]['name'] = 'Emerging Technologies';
+ $dept_name = $company['departments'][0]['name'];
?>
]]>
</programlisting>
+ <para> In either case, the dept_name variable is set to 'Emerging
Technologies'.
+ </para>
</example>
</para>
<para>
<example>
- <title>XPath Navigation</title>
+ <title>XPath navigation</title>
+ <para> The associative array index can be an XPath-like expression. Valid
+ expressions are defined by an augmented sub-set of XPath.
+ </para>
<para>
- We can use XPath expressions to navigate the data object
- instance structure. Two forms of indexing into many-valued
- properties are supported.
+ Two forms of indexing into many-valued properties are supported.
The first is the standard XPath array syntax with the indexing
starting at one, the second is an SDO extension to XPath with an index
- starting at zero. The following both get the second employee from the
- first department.
+ starting at zero. The standard syntax is:
</para>
- <programlisting role="php" id="sdo.examples.xpathnav">
+ <programlisting role="php" id="sdo.examples.xpath1nav">
<![CDATA[
<?php
$jane_doe = $company["departments[1]/employees[2]"];
+?>
+]]>
+ </programlisting>
+ <para>and the SDO XPath extension syntax is:</para>
+ <programlisting role="php" id="sdo.examples.xpath0nav">
+<![CDATA[
+<?php
$jane_doe = $company["departments.0/employees.1"];
?>
]]>
</programlisting>
+ <para>
+ Both these examples get the second employee from the first department.
+ </para>
</example>
</para>
<para>
<example>
- <title>XPath Querying</title>
+ <title>XPath querying</title>
<para>
We can use XPath to query and identify parts of a data object based
on instance data. The following retrieves the manager from the
'Advanced Technologies' department.
</para>
<programlisting role="php" id="sdo.examples.xpathquery">
-<![CDATA[
+ <![CDATA[
<?php
$ad_tech_mgr =
- $company["departments[name=\"Advanced
Technologies\"]/employees[manager=\"true\"]"];
+ $company["departments[name='Advanced
Technologies']/employees[manager=true]"];
?>
]]>
</programlisting>
@@ -682,7 +580,7 @@
<para>
<example>
- <title>Creating child data object</title>
+ <title>Creating child data objects</title>
<para>
A data object can be a factory for its child data objects.
A child data object is automatically part of the data graph.
@@ -692,7 +590,7 @@
<programlisting role="php" id="sdo.examples.create">
<![CDATA[
<?php
- $ad_tech_dept = $company["departments[name=\"Advanced Technologies\"]"];
+ $ad_tech_dept = $company["departments[name='Advanced Technologies']"];
$new_hire = $ad_tech_dept->createDataObject('employees');
$new_hire->name = 'John Johnson';
$new_hire->SN = 'E0005';
@@ -705,13 +603,46 @@
<para>
<example>
- <title>Unset referenced data object</title>
+ <title>Unset a primitive property</title>
<para>
We can use the <function>isset</function> and
<function>unset</function> functions to test and remove items
from the data object.
</para>
<para>
+ The following clears the name of the first department.
+ </para>
+ <programlisting role="php" id="sdo.examples.unsetprim">
+<![CDATA[
+<?php
+ unset($company->departments[0]->name);
+?>
+]]>
+ </programlisting>
+ </example>
+ </para>
+
+ <para>
+ <example>
+ <title>Unset a data object</title>
+ <para>
+ unset can also be used to remove a data object from the tree.
+ The following example shows John Jones leaving the company.
+ </para>
+ <programlisting role="php" id="sdo.examples.unsetdo">
+<![CDATA[
+<?php
+ unset($company->departments[0]->employees[0]);
+?>
+]]>
+ </programlisting>
+ </example>
+ </para>
+
+ <para>
+ <example>
+ <title>Unset a referenced data object</title>
+ <para>
The following removes the 'employeeOfTheMonth' from the company.
If this were a containment relationship then the
employee would be removed from the company
@@ -732,6 +663,32 @@
</programlisting>
</example>
</para>
+
+ <para>
+ <example>
+ <title>Access via property index</title>
+ <para> Data object properties can be accessed via their property index
using array
+ syntax. The property index is the position at which the property's
definition
+ appears in the model (in this case the xml schema). We can see from the
schema listing
+ above that the company name attribute is the second company property
(the SDO
+ interface makes no distinction between XML attributes and elements). The
following
+ sets the company name to 'Acme', with the same result as
+ <link linkend="sdo.examples.propname">Access via property name</link>
+ </para>
+ <programlisting role="php" id="sdo.examples.propindex">
+<![CDATA[
+<?php
+ $company[1] = 'Acme';
+?>
+]]>
+ </programlisting>
+ <para> Using the index directly in this way is likely to be fragile.
Normally the
+ property name syntax should be preferred, but the property index may be
required
+ in special cases.
+ </para>
+ </example>
+ </para>
+
</section>
<section id="sdo.sample.sequence">