Thank you for blogging on civicrm.org! Check out the blog policy for more tips on how to better engage with the community.
Publié
2007-07-15 14:52
This is Part 2 of my series on Writing Components For CiviCRM. Part 1 discussed what a component is, and what it does. The key tasks were:
- Define and manage a set of data base tables.
- Set up UI to view and edit contacts that contain its data.
- Make the content searchable.
<table> <base>CRM/Voter</base> <class>Campaign</class> <name>civicrm_voter_campaign</name> <comment>Campaign objects represent an election for a candidate or issue.</comment> <add>1.6</add> <field> <name>id</name> <type>int unsigned</type> <required>true</required> <comment>Unique Campaign ID</comment> <add>1.6</add> </field> <primaryKey> <name>id</name> <autoincrement>true</autoincrement> </primaryKey> <field> <name>default_campaign</name> <title>Default Campaign</title> <type>boolean</type> <default>0</default> <comment>Default campaign for this install.</comment> <add>1.6</add> </field> <field> <name>campaign_name</name> <required>true</required> <title>Campaign Title</title> <type>varchar</type> <length>30</length> <comment>Display name or title of the campaign</comment> <add>1.6</add> </field> <field> <name>start_date</name> <uniqueName>campaign_start_date</uniqueName> <title>Campaign Start Date</title> <type>date</type> <comment>Opening of political campaign.</comment> <add>1.6</add> </field> <field> <name>election_date</name> <title>Date Of Election</title> <type>date</type> <comment>Opening of political campaign.</comment> <add>1.6</add> </field> </table>Let's look at some of these directives. <base> tells CiviCRM's build system (more on that below) where you want the builder to put any PHP files it generates for you. This is relative to the top-level CiviCRM directory, where you'll find the api/, CRM/, sql/, templates/ and xml/ directories. The <class> directive tells the builder how to define the PHP loader and wrapper classes. CiviCRM uses the PHP PEAR DB_DataObject classes to handle most of the dirty work of getting at your data. It does this via a CiviCRM base class CRM_Core_DAO, which is defined in CRM/Core/DAO.php. CRM_Core_DAO handles your INSERT, UPDATE and DELETE statements, and you'll very rarely need to worry about these yourself. Every table in CiviCRM has a corresponding DAO (i.e., "Data Access Object") class, named using your value of class, and the "path" you gave in base. For the Campaign object:
- The builder will define a class CRM_Voter_DAO_Campaign, and
- The builder will put this definition in a CRM/Voter/DAO/Campaign.php file.
<tables xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="Voter.xml" parse="xml" />
<xi:include href="VoterInfo.xml" parse="xml" />
<xi:include href="Campaign.xml" parse="xml" />
<xi:include href="Canvass.xml" parse="xml" />
<xi:include href="CanvassContact.xml" parse="xml" />
<xi:include href="Districts.xml" parse="xml" />
</tables>
To get the builder to load this, the last step is to add the path to your files.xml file to the list in xml/schema/Schema.xml. It should be fairly obvious what to change. Once you've done this, you can run the builder utility, which is in
distmaker/distmaker.sh. You define a distmaker.conf file telling the builder where you want distmaker to put your files, and run it from the shell to generate a tar ball. To build the PHP5 version for Drupal, you type:
$ ./distmaker d5
If you have everything set up right, the script will generate a version civicrm_41.mysql that contains your newly defined tables, and a set of DAO class files to handle low level access.
You're still not quite done yet, however. You'll need to create BAO ("Business-logic Access Object") class definition files for each of your tables. The easiest thing here is to use another component as a model. I used Membership and Quest (a project Lobo & Co. did for a group of university admissions departments) as mine.
That's enough for today. I'll describe how to get your various files loaded, and how to export an API in the next installment.