Buckets:
| title: Custom Object Function - Sage Intacct SDK for PHP | Sage Intacct Developer | |
| url: https://developer.intacct.com/tools/sdk-php/custom-object-function/ | |
| # Custom Object Function - Sage Intacct SDK for PHP | Sage Intacct Developer | |
| Overview | |
| Getting Started | |
| List AR Invoices | |
| List Vendors (Legacy) | |
| CRUD Customer | |
| Custom Object Function | |
| Troubleshooting | |
| * Prerequisites | |
| * Set up | |
| * Run the example | |
| * Extra credit | |
| + Get the record by ID | |
| + Delete the record | |
| * What’s next? | |
| --- | |
| The example shows you how to: | |
| * Create a class that extends `AbstractFunction` and implements `FunctionInterface`. | |
| * Implement the `writeXml` function to generate XML for the API function for the request. | |
| * Call execute on a client and pass in the API function instance to send the request to the gateway. | |
| --- | |
| ## Prerequisites | |
| * You have downloaded or cloned the Sage Intacct SDK for PHP examples. | |
| * You successfully ran the getting started example—in particular, you set up the `.credentials.ini` file required by `bootstrap.php`. | |
| * The company you are using has Platform Services enabled and an object definition for your custom object (the example uses `test_object`). | |
| * The user you are using has add, edit, delete, list, and view permissions for the custom object. | |
| --- | |
| ## Set up | |
| 1. In the `composer.json` file, note that the `src/Example` directory is mapped to the `\Intacct\Example\` namespace in the autoloader: | |
| ```xml | |
| "autoload": { | |
| "psr-4": { | |
| "Intacct\\Example\\": "src/Example/" | |
| } | |
| } | |
| ``` | |
| 2. Open `src/Example/AbstractTestObject.php` and note how it extends `Intacct\Functions\AbstractFunction`. | |
| `AbstractFunction` is a helper class provided mainly to generate random control IDs. `AbstractFunction` implements `Intacct\Functions\FunctionInterface`, and any class whose instances will be executed by a client must implement `FunctionInterface`. If using `executeBatch`, the parameter must be a `FunctionInterface[]` array. | |
| 3. Open `src/Example/TestObjectCreate.php` and note how it extends `AbstractTestObject`. | |
| The `FunctionInterface` requires that the class implement the `writeXml(XMLWriter &$xml)` function. This implementation is where you provide the XML that will be processed at the gateway endpoint. | |
| 4. Back in `src/Example/AbstractTestObject.php`, replace `test_object` with the integration name for your custom object. | |
| ```xml | |
| const INTEGRATION_NAME = 'test_object'; | |
| ``` | |
| --- | |
| ## Run the example | |
| 1. Run the `custom-object-function.php` file: | |
| ```xml | |
| php custom-object-function.php | |
| ``` | |
| 2. Observe the terminal output, which should look similar to this: | |
| ```xml | |
| Created record ID 10153 | |
| Process finished with exit code 0 | |
| ``` | |
| Note the record ID, which will be used to delete the object later. | |
| 3. Open the generated `logs/intacct.html` file in your browser and review the entries. | |
| The file provides info and debug entries. The SDK provides a debug entry for each HTTP request/response (with the Sage Intacct endpoint). | |
| Note that the log file was created by the logger set in the client config. | |
| --- | |
| ## Extra credit | |
| ### Get the record by ID | |
| 1. Update `custom-object-function.php` to execute a `Read` function using the record ID returned by `TestObjectCreate` as the key. | |
| ```xml | |
| $read = new \Intacct\Functions\Common\Read(); | |
| $read->setObjectName(\Intacct\Example\TestObjectCreate::INTEGRATION_NAME); | |
| $read->setKeys([ | |
| $recordNo | |
| ]); | |
| $response = $client->execute($read); | |
| ``` | |
| ### Delete the record | |
| 1. Create a `TestObjectDelete` class and execute an instance of it that uses the same record ID returned in the `TestObjectCreate` result. | |
| If you need help, see the example class. | |
| ```xml | |
| <?php | |
| namespace Intacct\Example; | |
| use Intacct\Xml\XMLWriter; | |
| class TestObjectDelete extends AbstractTestObject | |
| { | |
| public function __construct($recordId) | |
| { | |
| $this->setId($recordId); | |
| } | |
| public function writeXml(XMLWriter &$xml) | |
| { | |
| $xml->startElement('function'); | |
| $xml->writeAttribute('controlid', $this->getControlId()); | |
| $xml->startElement('delete'); | |
| $xml->writeElement('object', self::INTEGRATION_NAME); | |
| $xml->writeElement('keys', $this->getId()); | |
| $xml->endElement(); // delete | |
| $xml->endElement(); // function | |
| } | |
| } | |
| ``` | |
| --- | |
| ## What’s next? | |
| For more complex examples, you can use the functions in the SDK as models. For example, `AbstractBill` extends `AbstractFunction`, then `BillCreate` and `BillDelete` extend `AbstractBill` and write the XML for creating or deleting bills. | |
| Provide feedback | |
Xet Storage Details
- Size:
- 4.74 kB
- Xet hash:
- e19e6c86d1b42c5ac9e7d76e441a1c74fa761ccc2fc273a59d3d53611db23629
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.