+--------------------------------------------------------------------+
| CiviCRM version 5 |
+--------------------------------------------------------------------+
- | Copyright CiviCRM LLC (c) 2004-2019 |
+ | Copyright CiviCRM LLC (c) 2004-2020 |
+--------------------------------------------------------------------+
| This file is a part of CiviCRM. |
| |
*
* @var string
*/
- protected $_context = NULL;
+ protected $_context;
/**
* The list of tasks or actions that a searcher can perform on a result set.
$this->searchFieldMetadata = array_merge($this->searchFieldMetadata, $searchFieldMetadata);
}
+ /**
+ * Prepare for search by loading options from the url, handling force searches, retrieving form values.
+ *
+ * @throws \CRM_Core_Exception
+ * @throws \CiviCRM_API3_Exception
+ */
+ public function preProcess() {
+ $this->loadStandardSearchOptionsFromUrl();
+ if ($this->_force) {
+ $this->handleForcedSearch();
+ }
+ $this->_formValues = $this->getFormValues();
+ }
+
/**
* This virtual function is used to set the default values of various form elements.
*
* @throws \CRM_Core_Exception
*/
public function setDefaultValues() {
- $defaults = (array) $this->_formValues;
+ // Use the form values stored to the form. Ideally 'formValues'
+ // would remain 'pure' & another array would be wrangled.
+ // We don't do that - so we want the version of formValues stored early on.
+ $defaults = (array) $this->get('formValues');
foreach (array_keys($this->getSearchFieldMetadata()) as $entity) {
$defaults = array_merge($this->getEntityDefaults($entity), $defaults);
}
*/
protected function setFormValues() {
$this->_formValues = $this->getFormValues();
+ $this->set('formValues', $this->_formValues);
$this->convertTextStringsToUseLikeOperator();
}
/**
* Common buildForm tasks required by all searches.
+ *
+ * @throws \CRM_Core_Exception
*/
public function buildQuickForm() {
CRM_Core_Resources::singleton()
*
* The goal is to describe all fields in metadata and handle from metadata rather
* than existing ad hoc handling.
+ *
+ * @throws \CiviCRM_API3_Exception
*/
public function addFormFieldsFromMetadata() {
$this->addFormRule(['CRM_Core_Form_Search', 'formRule'], $this);
foreach ($this->getSearchFieldMetadata() as $entity => $fields) {
foreach ($fields as $fieldName => $fieldSpec) {
$fieldType = $fieldSpec['type'] ?? '';
- if ($fieldType === CRM_Utils_Type::T_DATE || $fieldType === (CRM_Utils_Type::T_DATE + CRM_Utils_Type::T_TIME)) {
+ if ($fieldType === CRM_Utils_Type::T_DATE || $fieldType === (CRM_Utils_Type::T_DATE + CRM_Utils_Type::T_TIME) || $fieldType === CRM_Utils_Type::T_TIMESTAMP) {
$title = empty($fieldSpec['unique_title']) ? $fieldSpec['title'] : $fieldSpec['unique_title'];
- $this->addDatePickerRange($fieldName, $title, ($fieldType === (CRM_Utils_Type::T_DATE + CRM_Utils_Type::T_TIME)));
+ $this->addDatePickerRange($fieldName, $title, ($fieldType === (CRM_Utils_Type::T_DATE + CRM_Utils_Type::T_TIME) || $fieldType === CRM_Utils_Type::T_TIMESTAMP));
}
else {
// Not quite sure about moving to a mix of keying by entity vs permitting entity to
*
* Note that for translation purposes the full string works better than using 'prefix' hence we use override-able functions
* to define the string.
+ *
+ * @throws \CiviCRM_API3_Exception
*/
protected function addSortNameField() {
$title = civicrm_api3('setting', 'getvalue', ['name' => 'includeEmailInName', 'group' => 'Search Preferences']) ? $this->getSortNameLabelWithEmail() : $this->getSortNameLabelWithOutEmail();
/**
* Add generic fields that specify the contact.
+ *
+ * @throws \CiviCRM_API3_Exception
*/
protected function addContactSearchFields() {
if (!$this->isFormInViewOrEditMode()) {
/**
* we allow the controller to set force/reset externally, useful when we are being
* driven by the wizard framework
+ *
+ * @throws \CRM_Core_Exception
*/
protected function loadStandardSearchOptionsFromUrl() {
$this->_reset = CRM_Utils_Request::retrieve('reset', 'Boolean');
return (array) $this->get('formValues');
}
+ /**
+ * Get the string processed to determine sort order.
+ *
+ * This looks like 'sort_name_u' for Sort name ascending.
+ *
+ * @return string|null
+ */
+ protected function getSortID() {
+ if ($this->get(CRM_Utils_Sort::SORT_ID)) {
+ return CRM_Utils_Sort::sortIDValue($this->get(CRM_Utils_Sort::SORT_ID),
+ $this->get(CRM_Utils_Sort::SORT_DIRECTION)
+ );
+ }
+ return NULL;
+ }
+
+ /**
+ * Set the metadata for the form.
+ *
+ * @throws \CiviCRM_API3_Exception
+ */
+ protected function setSearchMetadata() {}
+
+ /**
+ * Handle force=1 in the url.
+ *
+ * Search field metadata is normally added in buildForm but we are bypassing that in this flow
+ * (I've always found the flow kinda confusing & perhaps that is the problem but this mitigates)
+ *
+ * @throws \CiviCRM_API3_Exception
+ */
+ protected function handleForcedSearch() {
+ $this->setSearchMetadata();
+ $this->addContactSearchFields();
+ $this->postProcess();
+ $this->set('force', 0);
+ }
+
}