Merge pull request #3079 from mepps/fix-jquery-autocomplete-search
[civicrm-core.git] / CRM / Core / Form / Tag.php
index 7263d9371bf3966f35036205c23c004ec7ec48f2..f7ffb32f57adb7825b987843948f000a18ed1e66 100644 (file)
@@ -1,9 +1,9 @@
 <?php
 /*
  +--------------------------------------------------------------------+
- | CiviCRM version 4.4                                                |
+ | CiviCRM version 4.5                                                |
  +--------------------------------------------------------------------+
- | Copyright CiviCRM LLC (c) 2004-2013                                |
+ | Copyright CiviCRM LLC (c) 2004-2014                                |
  +--------------------------------------------------------------------+
  | This file is a part of CiviCRM.                                    |
  |                                                                    |
@@ -28,7 +28,7 @@
 /**
  *
  * @package CRM
- * @copyright CiviCRM LLC (c) 2004-2013
+ * @copyright CiviCRM LLC (c) 2004-2014
  * $Id$
  *
  */
@@ -43,8 +43,8 @@ class CRM_Core_Form_Tag {
   /**
    * Function to build tag widget if correct parent is passed
    *
-   * @param object  $form form object
-   * @param string  $parentName parent name ( tag name)
+   * @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
@@ -57,165 +57,47 @@ class CRM_Core_Form_Tag {
    * @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';
+        list(, $mode) = explode('_', $entityTable);
+        if (!$tagsetElementName) {
+          $tagsetElementName = $mode . "_taglist";
         }
-
-        $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';
-        }
-
         $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']) && !empty($form->_submitValues['activity_taglist'][$parentId])) {
-                $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']) && !empty($form->_submitValues['case_taglist'][$parentId])) {
-                $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"]) && !empty($form->_submitValues["attachment_taglist_$i"][$parentId])) {
-                  $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 (!empty($contactTags[$tagId])) {
-                    $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;
       }
     }
 
@@ -223,7 +105,13 @@ class CRM_Core_Form_Tag {
       // 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);
     }
   }