<?php
/*
+--------------------------------------------------------------------+
- | CiviCRM version 4.4 |
+ | CiviCRM version 4.6 |
+--------------------------------------------------------------------+
- | Copyright CiviCRM LLC (c) 2004-2013 |
+ | Copyright CiviCRM LLC (c) 2004-2014 |
+--------------------------------------------------------------------+
| This file is a part of CiviCRM. |
| |
/**
*
* @package CRM
- * @copyright CiviCRM LLC (c) 2004-2013
+ * @copyright CiviCRM LLC (c) 2004-2014
* $Id$
*
*/
public $_entityTagValues;
/**
- * Function to build tag widget if correct parent is passed
+ * Build tag widget if correct parent is passed
*
- * @param object $form form object
- * @param string $parentName parent name ( tag name)
- * @param string $entityTable entitytable 'eg: civicrm_contact'
- * @param int $entityId entityid 'eg: contact id'
+ * @param CRM_Core_Form $form form object
+ * @param string $parentNames parent name ( tag name)
+ * @param string $entityTable entitytable 'eg: civicrm_contact'
+ * @param int $entityId entityid 'eg: contact id'
* @param boolean $skipTagCreate true if tag need be created using ajax
* @param boolean $skipEntityAction true if need to add entry in entry table via ajax
- * @param boolean $searchMode true if widget is used in search eg: advanced search
- * @param string $tagsetElementName if you need to create tagsetlist with specific name
+ * @param string $tagsetElementName if you need to create tagsetlist with specific name
*
* @return void
* @access public
* @static
*/
static function buildQuickForm(&$form, $parentNames, $entityTable, $entityId = NULL, $skipTagCreate = FALSE,
- $skipEntityAction = FALSE, $searchMode = FALSE, $tagsetElementName = NULL ) {
+ $skipEntityAction = FALSE, $tagsetElementName = NULL ) {
$tagset = $form->_entityTagValues = array();
$form->assign("isTagset", FALSE);
$mode = NULL;
- foreach ($parentNames as & $parentNameItem) {
+ foreach ($parentNames as &$parentNameItem) {
// get the parent id for tag list input for keyword
$parentId = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Tag', $parentNameItem, 'id', 'name');
// check if parent exists
- $entityTags = array();
if ($parentId) {
- $tagsetItem = 'parentId_' . $parentId;
- $tagset[$tagsetItem]['parentName'] = $parentNameItem;
+ $tagsetItem = $tagsetElementName . 'parentId_' . $parentId;
$tagset[$tagsetItem]['parentID'] = $parentId;
- //tokeninput url
- $qparams = "parentId={$parentId}";
-
- if ($searchMode) {
- $qparams .= '&search=1';
- }
-
- $tagUrl = CRM_Utils_System::url('civicrm/ajax/taglist', $qparams, FALSE, NULL, FALSE);
-
- $tagset[$tagsetItem]['tagUrl'] = $tagUrl;
- $tagset[$tagsetItem]['entityTable'] = $entityTable;
- $tagset[$tagsetItem]['skipTagCreate'] = $skipTagCreate;
- $tagset[$tagsetItem]['skipEntityAction'] = $skipEntityAction;
-
- switch ($entityTable) {
- case 'civicrm_activity':
- $tagsetElementName = "activity_taglist";
- $mode = 'activity';
- break;
-
- case 'civicrm_case':
- $tagsetElementName = "case_taglist";
- $mode = 'case';
- break;
-
- case 'civicrm_file':
- $mode = 'attachment';
- break;
-
- default:
- $tagsetElementName = "contact_taglist";
- $mode = 'contact';
+ list(, $mode) = explode('_', $entityTable);
+ if (!$tagsetElementName) {
+ $tagsetElementName = $mode . "_taglist";
}
-
$tagset[$tagsetItem]['tagsetElementName'] = $tagsetElementName;
- if ($tagsetElementName) {
- $form->add('text', "{$tagsetElementName}[{$parentId}]", NULL);
- }
+
+ $form->addEntityRef("{$tagsetElementName}[{$parentId}]", $parentNameItem, array(
+ 'entity' => 'tag',
+ 'multiple' => TRUE,
+ 'create' => !$skipTagCreate,
+ 'api' => array('params' => array('parent_id' => $parentId)),
+ 'data-entity_table' => $entityTable,
+ 'data-entity_id' => $entityId,
+ 'class' => "crm-$mode-tagset",
+ ));
if ($entityId) {
$tagset[$tagsetItem]['entityId'] = $entityId;
$entityTags = CRM_Core_BAO_EntityTag::getChildEntityTags($parentId, $entityId, $entityTable);
- }
- else {
-
- switch ($entityTable) {
- case 'civicrm_activity':
- if (!empty($form->_submitValues['activity_taglist']) &&
- CRM_Utils_Array::value($parentId, $form->_submitValues['activity_taglist'])
- ) {
- $allTags = CRM_Core_PseudoConstant::get('CRM_Core_DAO_EntityTag', 'tag_id', array('onlyActive' => FALSE));
- $tagIds = explode(',', $form->_submitValues['activity_taglist'][$parentId]);
- foreach ($tagIds as $tagId) {
- if (is_numeric($tagId)) {
- $tagName = $allTags[$tagId];
- }
- else {
- $tagName = $tagId;
- }
- $entityTags[$tagId] = array(
- 'id' => $tagId,
- 'name' => $tagName,
- );
- }
- }
- break;
-
- case 'civicrm_case':
- if (!empty($form->_submitValues['case_taglist']) &&
- CRM_Utils_Array::value($parentId, $form->_submitValues['case_taglist'])
- ) {
- $allTags = CRM_Core_PseudoConstant::get('CRM_Core_DAO_EntityTag', 'tag_id', array('onlyActive' => FALSE));
- $tagIds = explode(',', $form->_submitValues['case_taglist'][$parentId]);
- foreach ($tagIds as $tagId) {
- if (is_numeric($tagId)) {
- $tagName = $allTags[$tagId];
- }
- else {
- $tagName = $tagId;
- }
- $entityTags[$tagId] = array(
- 'id' => $tagId,
- 'name' => $tagName,
- );
- }
- }
- break;
- case 'civicrm_file':
- $numAttachments = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'max_attachments');
- for ($i = 1; $i <= $numAttachments; $i++) {
- $tagset[$i] = $tagset[$tagsetItem];
- $tagset[$i]['tagsetElementName'] = "attachment_taglist_$i";
- $form->add('text', "attachment_taglist_{$i}[{$parentId}]", NULL);
- if (!empty($form->_submitValues["attachment_taglist_$i"]) &&
- CRM_Utils_Array::value($parentId, $form->_submitValues["attachment_taglist_$i"])
- ) {
- $allTags = CRM_Core_PseudoConstant::get('CRM_Core_DAO_EntityTag', 'tag_id', array('onlyActive' => FALSE));
- $tagIds = explode(',', $form->_submitValues["attachment_taglist_$i"][$parentId]);
- foreach ($tagIds as $tagId) {
- if (is_numeric($tagId)) {
- $tagName = $allTags[$tagId];
- }
- else {
- $tagName = $tagId;
- }
- $entityTags[$tagId] = array(
- 'id' => $tagId,
- 'name' => $tagName,
- );
- }
- }
- }
- unset($tagset[$tagsetItem]);
- break;
-
- default:
- if (!empty($form->_formValues['contact_tags'])) {
- $contactTags = CRM_Core_BAO_Tag::getTagsUsedFor('civicrm_contact', TRUE, FALSE, $parentId);
-
- foreach (array_keys($form->_formValues['contact_tags']) as $tagId) {
- if (CRM_Utils_Array::value($tagId, $contactTags)) {
- $tagName = $tagId;
- if (is_numeric($tagId)) {
- $tagName = $contactTags[$tagId];
- }
-
- $entityTags[$tagId] = array(
- 'id' => $tagId,
- 'name' => $tagName,
- );
- }
- }
- }
+ if ($entityTags) {
+ $form->setDefaults(array("{$tagsetElementName}[{$parentId}]" => implode(',', array_keys($entityTags))));
}
}
-
- if (!empty($entityTags)) {
- // assign as simple array for display in smarty
- $tagset[$tagsetItem]['entityTagsArray'] = $entityTags;
- // assign as json for js widget
- $tagset[$tagsetItem]['entityTags'] = json_encode(array_values($entityTags));
-
- if (!empty($form->_entityTagValues)) {
- $form->_entityTagValues = CRM_Utils_Array::crmArrayMerge($entityTags, $form->_entityTagValues);
- }
- else {
- $form->_entityTagValues = $entityTags;
- }
+ else {
+ $skipEntityAction = TRUE;
}
+ $tagset[$tagsetItem]['skipEntityAction'] = $skipEntityAction;
}
}
if (!empty($tagset)) {
+ // assign current tagsets which is used in postProcess
+ $form->_tagsetInfo = $tagset;
$form->assign("tagsetType", $mode);
- $form->assign("tagsetInfo_$mode", $tagset);
+ // Merge this tagset info with possibly existing info in the template
+ $tagsetInfo = (array) $form->get_template_vars("tagsetInfo");
+ if (empty($tagsetInfo[$mode])) {
+ $tagsetInfo[$mode] = array();
+ }
+ $tagsetInfo[$mode] = array_merge($tagsetInfo[$mode], $tagset);
+ $form->assign("tagsetInfo", $tagsetInfo);
$form->assign("isTagset", TRUE);
}
}
/**
- * Function to save entity tags when it is not save used AJAX
+ * Save entity tags when it is not save used AJAX
+ *
+ * @param array $params associated array
+ * @param int $entityId entity id, eg: contact id, activity id, case id, file id
+ * @param string $entityTable entity table
+ * @param CRM_Core_Form $form form object
*
+ * @return void
+ * @access public
+ * @static
*/
static function postProcess(&$params, $entityId, $entityTable = 'civicrm_contact', &$form) {
- foreach ($params as $value) {
- if (!$value) {
- continue;
+ if ($form && !empty($form->_entityTagValues)) {
+ $existingTags = $form->_entityTagValues;
+ }
+ else {
+ $existingTags = CRM_Core_BAO_EntityTag::getTag($entityId, $entityTable);
+ }
+
+ if ($form) {
+ // if the key is missing from the form response then all the tags were deleted / cleared
+ // in that case we create empty tagset params so that below logic works and tagset are
+ // deleted correctly
+ foreach ($form->_tagsetInfo as $tagsetName => $tagsetInfo) {
+ $tagsetId = explode('parentId_', $tagsetName);
+ $tagsetId = $tagsetId[1];
+ if (empty($params[$tagsetId])) {
+ $params[$tagsetId] = '';
+ }
}
- $tagsIDs = explode(',', $value);
- $insertValues = array();
- $insertSQL = NULL;
- if (!empty($tagsIDs)) {
- foreach ($tagsIDs as $tagId) {
- if (is_numeric($tagId)) {
- if ($form && $form->_action != CRM_Core_Action::UPDATE) {
- $insertValues[] = "( {$tagId}, {$entityId}, '{$entityTable}' ) ";
- }
- elseif (!$form || !array_key_exists($tagId, $form->_entityTagValues)) {
- $insertValues[] = "( {$tagId}, {$entityId}, '{$entityTable}' ) ";
- }
+ }
+
+ // when form is submitted with tagset values below logic will work and in the case when all tags in a tagset
+ // are deleted we will have to set $params[tagset id] = '' which is done by above logic
+ foreach ($params as $parentId => $value) {
+ $newTagIds = array();
+ $tagIds = array();
+
+ if ($value) {
+ $tagIds = explode(',', $value);
+ foreach ($tagIds as $tagId) {
+ if ($form && $form->_action != CRM_Core_Action::UPDATE || !array_key_exists($tagId, $existingTags)) {
+ $newTagIds[] = $tagId;
}
}
+ }
+
+ // Any existing entity tags from this tagset missing from the $params should be deleted
+ $deleteSQL = "DELETE FROM civicrm_entity_tag
+ USING civicrm_entity_tag, civicrm_tag
+ WHERE civicrm_tag.id=civicrm_entity_tag.tag_id
+ AND civicrm_entity_tag.entity_table='{$entityTable}'
+ AND entity_id={$entityId} AND parent_id={$parentId}";
+ if (!empty($tagIds)) {
+ $deleteSQL .= " AND tag_id NOT IN (" . implode(', ', $tagIds) . ");";
+ }
+
+ CRM_Core_DAO::executeQuery($deleteSQL);
- if (!empty($insertValues)) {
- $insertSQL = 'INSERT INTO civicrm_entity_tag ( tag_id, entity_id, entity_table ) VALUES ' . implode(', ', $insertValues) . ';';
- CRM_Core_DAO::executeQuery($insertSQL);
+ if (!empty($newTagIds)) {
+ // New tag ids can be inserted directly into the db table.
+ $insertValues = array();
+ foreach ($newTagIds as $tagId) {
+ $insertValues[] = "( {$tagId}, {$entityId}, '{$entityTable}' ) ";
}
+ $insertSQL = 'INSERT INTO civicrm_entity_tag ( tag_id, entity_id, entity_table )
+ VALUES ' . implode(', ', $insertValues) . ';';
+ CRM_Core_DAO::executeQuery($insertSQL);
}
}
}