PDFTemplate - Grandchild relationship

Collapse
X
 
  • Time
  • Show
Clear All
new posts

  • item
    replied
    So this work ... not really good coding .. but you can adapt :

    service/ contact.php

    PHP Code:
    <?php
    namespace Espo\Custom\Services;
    
    use Espo\ORM\{
    Entity,
    EntityManager,
    ServiceFactory,
    };
    
    class Contact extends \Espo\Modules\Crm\Services\Contact
    {
    protected function contactFromParent(Entity $entity)
    {
    $em = $this->getEntityManager();
    $contactId = $entity->id;
    $parentAccountId = $entity->get('accountId');
    
    $account = $em->getEntity('Account', $parentAccountId);
    $contacts = $em->getRepository('Account')
    ->getRelation($account, 'contacts')
    ->order('name')
    ->find();
    
    
    foreach ($contacts as $contact) {
    
    $contactFromParentList[$contact->id]['name'] = $contact->get('name');
    }
    
    
    $parentContactJson = json_decode(json_encode($contactFromParentList, true));
    
    $entity->set('parentContactJson',$parentContactJson );
    }
    public function loadAdditionalFields(Entity $entity)
    {
    parent::loadAdditionalFields($entity);
    $this->contactFromParent($entity);
    
    //$GLOBALS['log']->warning( $entity->get('calls' ) );
    }
    
    public function loadAdditionalFieldsForPdf(Entity $entity)
    {
    $this->loadAdditionalFields($entity);
    
    }
    
    }
    i have forget the cruxial : need to add in metadata a custom field :

    entityDefs/contact :

    important is jsonArray and notStorable .. other i don't know
    PHP Code:
    "parentContactJson": {
    "type": "jsonArray",
    "notStorable": true,
    "layoutDetailDisabled": true,
    "layoutFiltersDisabled": true,
    "layoutListDisabled": true,
    "reportDisabled": true
    } 
    
    en in pdf :

    {{#each parentContactJson}}
    {{name}}

    {{/each}}


    Please choose better "word" for field

    Leave a comment:


  • item
    commented on 's reply
    i will try then i come..

  • esforim
    replied
    Thank you so much item. I gave this a try but failed. I create a Contact.php file with the code.

    File:
    Code:
     /custom/Espo/Custom/Services/Contact.php
    Getting this error on rebuild:
    Code:
    Server side error 500: Class Espo\Custom\Services\Contact does not exist
    As for the code all I did was change the word Specifications to Account

    Code:
    public function getEntityAccountList(Entity $entity)
    {
    $pdo = $this->getEntityManager()->getPDO();
    $accountList = [];
    
    $sql = "
    SELECT DISTINCT `id`, `seconds`, `type`
    FROM `account`
    WHERE
    `entity_type` = ".$pdo->quote($entity->getEntityType())." AND
    `entity_id` = ".$pdo->quote($entity->id)." AND
    `deleted` = 0
    ORDER BY `seconds` ASC
    ";
    
    $sth = $pdo->prepare($sql);
    $sth->execute();
    $rows = $sth->fetchAll(\PDO::FETCH_ASSOC);
    
    foreach ($rows as $row) {
    $o = new \StdClass();
    $o->id = $row['id'];
    $o->seconds = intval($row['seconds']);
    $o->type = $row['type'];
    $accountList[] = $o;
    }
    return $accountList;
    }
    
    public function loadAdditionalFields(Entity $entity)
    {
    parent::loadAdditionalFields($entity);
    $this->loadAccountsField($entity);
    }
    
    protected function loadAccountsField(Entity $entity)
    {
    $specifications = $this->getRepository()->getEntityAccountList($entity);
    $entity->set('account', $accounts);
    }
    Looking at other file in the folder, it seem like I need to do something like this:

    Code:
    <?php
    
    namespace Espo\Custom\Services;
    
    class Contact extends \Espo\Core\Templates\Services\BasePlus
    {
    }
    But this where I have no idea what to do next. Thank you very much.

    Leave a comment:


  • item
    replied
    Hello,
    look : loadAdditionalFields

    step :
    in service of your entity contact :

    PHP Code:
    
    
    public function getEntitySpecificationList(Entity $entity)
    {
    $pdo = $this->getEntityManager()->getPDO();
    $specificationList = [];
    
    $sql = "
    SELECT DISTINCT `id`, `seconds`, `type`
    FROM `specification`
    WHERE
    `entity_type` = ".$pdo->quote($entity->getEntityType())." AND
    `entity_id` = ".$pdo->quote($entity->id)." AND
    `deleted` = 0
    ORDER BY `seconds` ASC
    ";
    
    $sth = $pdo->prepare($sql);
    $sth->execute();
    $rows = $sth->fetchAll(\PDO::FETCH_ASSOC);
    
    foreach ($rows as $row) {
    $o = new \StdClass();
    $o->id = $row['id'];
    $o->seconds = intval($row['seconds']);
    $o->type = $row['type'];
    $specificationList[] = $o;
    }
    return $specificationList;
    }
    
    public function loadAdditionalFields(Entity $entity)
    {
    parent::loadAdditionalFields($entity);
    $this->loadSpecificationsField($entity);
    }
    
    protected function loadSpecificationsField(Entity $entity)
    {
    $specifications = $this->getRepository()->getEntitySpecificationList($entity);
    $entity->set('specification', $specifications);
    } 
    
    and in your pdf :

    {{#each specification}}

    for your request is no need sql.. you can use orm.
    for info, specification is not a field in entity ..

    Leave a comment:


  • esforim
    started a topic PDFTemplate - Grandchild relationship

    PDFTemplate - Grandchild relationship

    Reading this thread it seem like it is possible to get the grandchild (not sure if this correct term) of an entity: https://forum.espocrm.com/forum/deve...nd-grand-child

    But that is for Query not for PDF Template Printing.

    Anyway here is an example data:

    PDF Template on Contact
    (For entity Contact)
    Contact Name: Mr John Smith
    Contact Account: EspoCRM
    Account Title: Director

    (For entity Account)
    Account name: EspoCRM
    Relationship: Mr John Smith - Director
    Relationship: Mr Stuart Smith - Engineer
    Relationship: Ms Jane Smith - Finance

    And here is what I'm trying to do.

    When I print John Smith PDF, I also want to know what other contact is in the Account EspoCRM. I tried variation code like so but it doesn't seem to work, only added 3 method below otherwise I tried about 10 variation.

    This would get me the Contact information
    Code:
    {{#each accounts}}
    {{name}} -  {{contactRole}}
    {{/each}}
    Now to try and get "grandchild"

    Test 1
    Code:
    {{#each contacts.accounts}}
    {{name}} -  {{contactRole}}
    {{/each}}
    Test 2
    Code:
    {{#each accounts.contact}}
    {{name}} - {{contactRole}}
    {{/each}}
    Test 3
    Code:
    {{#each accounts}}
    {{name}} - {{contactRole}}
    {{#each contacts.accounts}}
    {{name}} - {{contactRole}}
    {{/each}}
    {{/each}}
    Why not just go into Account and use this code?
    Code:
    {{#each contacts}}
    {{name}} -  {{contactRole}}
    {{/each}}
    Because I want to get Contact information as well. And there is more information I want from Account not just the name and Role.

    If anything not clear please let me know. Appreciate if anyone know on a how-to solve this.
Working...