<?php
/*
+--------------------------------------------------------------------+
- | CiviCRM version 4.5 |
+ | CiviCRM version 4.6 |
+--------------------------------------------------------------------+
| Copyright CiviCRM LLC (c) 2004-2014 |
+--------------------------------------------------------------------+
*
* @return bool
*/
- function verifyPreDBstate(&$errors) {
+ public function verifyPreDBstate(&$errors) {
return TRUE;
}
* @param $rev string, a version number, e.g. '4.4.alpha1', '4.4.beta3', '4.4.0'
* @param null $currentVer
*
- * @internal param string $postUpgradeMessage , alterable
* @return void
*/
- function setPreUpgradeMessage(&$preUpgradeMessage, $rev, $currentVer = NULL) {
+ public function setPreUpgradeMessage(&$preUpgradeMessage, $rev, $currentVer = NULL) {
if ($rev == '4.4.beta1') {
$apiCalls = self::getConfigArraysAsAPIParams(FALSE);
$oversizedEntries = 0;
* @param $rev string, an intermediate version; note that setPostUpgradeMessage is called repeatedly with different $revs
* @return void
*/
- function setPostUpgradeMessage(&$postUpgradeMessage, $rev) {
+ public function setPostUpgradeMessage(&$postUpgradeMessage, $rev) {
if ($rev == '4.4.1') {
$config = CRM_Core_Config::singleton();
if (!empty($config->useIDS)) {
*
* @return bool
*/
- function upgrade_4_4_alpha1($rev) {
+ public function upgrade_4_4_alpha1($rev) {
// task to process sql
$this->addTask(ts('Upgrade DB to %1: SQL', array(1 => '4.4.alpha1')), 'task_4_4_x_runSql', $rev);
/**
* @param $rev
*/
- function upgrade_4_4_beta1($rev) {
+ public function upgrade_4_4_beta1($rev) {
$this->addTask(ts('Upgrade DB to %1: SQL', array(1 => '4.4.beta1')), 'task_4_4_x_runSql', $rev);
// add new 'data' column in civicrm_batch
/**
* @param $rev
*/
- function upgrade_4_4_1($rev) {
+ public function upgrade_4_4_1($rev) {
$config = CRM_Core_Config::singleton();
// CRM-13327 upgrade handling for the newly added name badges
$ogID = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_OptionGroup', 'name_badge', 'id', 'name');
*
* @return bool
*/
- function upgrade_4_4_4($rev) {
+ public function upgrade_4_4_4($rev) {
$fkConstraint = array();
if (!CRM_Core_DAO::checkFKConstraintInFormat('civicrm_activity_contact', 'activity_id')) {
$fkConstraint[] = "ADD CONSTRAINT `FK_civicrm_activity_contact_activity_id` FOREIGN KEY (`activity_id`) REFERENCES `civicrm_activity` (`id`) ON DELETE CASCADE";
/**
* @param $rev
*/
- function upgrade_4_4_6($rev){
+ public function upgrade_4_4_6($rev){
$sql = "SELECT count(*) AS count FROM INFORMATION_SCHEMA.STATISTICS where ".
"TABLE_SCHEMA = database() AND INDEX_NAME = 'index_image_url' AND TABLE_NAME = 'civicrm_contact';";
$dao = CRM_Core_DAO::executeQuery($sql);
/**
* @param CRM_Queue_TaskContext $ctx
- * @param $startId
- * @param $endId
+ * @param int $startId
+ * @param int $endId
*
* @return bool
*/
- static function upgradeImageUrls(CRM_Queue_TaskContext $ctx, $startId, $endId){
- $sql = "
-SELECT id, image_url
-FROM civicrm_contact
-WHERE 1
-AND id BETWEEN %1 AND %2
-AND image_URL IS NOT NULL
-";
- $params = array(
- 1 => array($startId, 'Integer'),
- 2 => array($endId, 'Integer'),
- );
- $dao = CRM_Core_DAO::executeQuery($sql, $params, TRUE, NULL, FALSE, FALSE);
+ public function upgrade_4_4_7($rev, $originalVer, $latestVer) {
+ // For WordPress/Joomla(?), cleanup broken image_URL from 4.4.6 upgrades - https://issues.civicrm.org/jira/browse/CRM-14971
+ $exBackendUrl = CRM_Utils_System::url('civicrm/contact/imagefile', 'photo=XXX', TRUE); // URL formula from 4.4.6 upgrade
+ $exFrontendUrl = CRM_Utils_System::url('civicrm/contact/imagefile', 'photo=XXX', TRUE, NULL, TRUE, TRUE);
+ if ($originalVer == '4.4.6' && $exBackendUrl != $exFrontendUrl) {
+ $minId = CRM_Core_DAO::singleValueQuery('SELECT coalesce(min(id),0) FROM civicrm_contact WHERE image_URL IS NOT NULL');
+ $maxId = CRM_Core_DAO::singleValueQuery('SELECT coalesce(max(id),0) FROM civicrm_contact WHERE image_URL IS NOT NULL');
+ for ($startId = $minId; $startId <= $maxId; $startId += self::BATCH_SIZE) {
+ $endId = $startId + self::BATCH_SIZE - 1;
+ $title = ts('Upgrade image_urls (%1 => %2)', array(1 => $startId, 2 => $endId));
+ $this->addTask($title, 'cleanupBackendImageUrls', $startId, $endId);
+ }
+ }
+ $this->addTask(ts('Update saved search information'), 'changeSavedSearch');
+ }
+
+ public static function upgradeImageUrls(CRM_Queue_TaskContext $ctx, $startId, $endId){
+ $dao = self::findContactImageUrls($startId, $endId);
$failures = array();
while ($dao->fetch()){
$imageURL = $dao->image_url;
$config = CRM_Core_Config::singleton();
$fullpath = $config->customFileUploadDir.$photo;
if (file_exists($fullpath)){
- $newimageurl = CRM_Utils_System::url('civicrm/contact/imagefile', 'photo='.$photo, TRUE);
- $sql = 'UPDATE civicrm_contact SET image_url=%1 WHERE id=%2';
- $params = array(
- 1 => array($newimageurl, 'String'),
- 2 => array($dao->id, 'Integer'),
- );
- $updatedao = CRM_Core_DAO::executeQuery($sql, $params);
+ // For anyone who upgraded 4.4.6 release (eg 4.4.0=>4.4.6), the $newImageUrl incorrectly used backend URLs.
+ // For anyone who skipped 4.4.6 (eg 4.4.0=>4.4.7), the $newImageUrl correctly uses frontend URLs
+ self::setContactImageUrl($dao->id,
+ CRM_Utils_System::url('civicrm/contact/imagefile', 'photo='.$photo, TRUE, NULL, TRUE, TRUE));
}
else{
$failures[$dao->id] = $dao->image_url;
return TRUE;
}
+ public static function changeSavedSearch(CRM_Queue_TaskContext $ctx) {
+ $membershipStatuses = array_flip(CRM_Member_PseudoConstant::membershipStatus());
+
+ $dao = new CRM_Contact_DAO_SavedSearch();
+ $dao->find();
+ while ($dao->fetch()) {
+ $formValues = CRM_Contact_BAO_SavedSearch::getFormValues($dao->id);
+ if (!empty($formValues['mapper'])) {
+ foreach ($formValues['mapper'] as $key => $value) {
+ foreach ($value as $k => $v) {
+ if ($v[0] == 'Membership' && in_array($v[1], array('membership_status', 'membership_status_id'))) {
+ $value = $formValues['value'][$key][$k];
+ $op = $formValues['operator'][$key][$k];
+ if ($op == 'IN') {
+ $value = trim($value);
+ $value = str_replace('(', '', $value);
+ $value = str_replace(')', '', $value);
+
+ $v = explode(',', $value);
+ $value = array();
+ foreach ($v as $k1 => $v2) {
+ if (is_numeric($v2)) {
+ break 2;
+ }
+ $value[$k1] = $membershipStatuses[$v2];
+ }
+ $formValues['value'][$key][$k] = "(" . implode(',', $value) . ")";
+ }
+ elseif (in_array($op, array('=', '!='))) {
+ if (is_numeric($value)) {
+ break;
+ }
+ $formValues['value'][$key][$k] = $membershipStatuses[$value];
+ }
+ }
+ }
+ }
+ $dao->form_values = serialize($formValues);
+ $dao->save();
+ }
+ }
+
+ return TRUE;
+ }
+
+ /**
+ * For WordPress/Joomla(?) sites which upgraded to 4.4.6, find back-end image_URLs
+ * (e.g. "http://example.com/wp-admin/admin.php?page=CiviCRM&q=civicrm/contact/imagefile&photo=123.jpg")
+ * and convert them to front-end URLs
+ * (e.g. "http://example.com/?page=CiviCRM&q=civicrm/contact/imagefile&photo=123.jpg").
+ *
+ * @param CRM_Queue_TaskContext $ctx
+ * @param int $startId
+ * @param int $endId
+ * @return bool
+ */
+ public static function cleanupBackendImageUrls(CRM_Queue_TaskContext $ctx, $startId, $endId) {
+ $dao = self::findContactImageUrls($startId, $endId);
+ while ($dao->fetch()) {
+ $imageUrl = str_replace('&', '&', $dao->image_url);
+ if (preg_match(":civicrm/contact/imagefile.*photo=:", $imageUrl)) {
+ // looks like one of ours
+ $imageUrlParts = parse_url($imageUrl);
+ parse_str($imageUrlParts['query'], $imageUrlQuery);
+ self::setContactImageUrl($dao->id,
+ CRM_Utils_System::url('civicrm/contact/imagefile', 'photo='.$imageUrlQuery['photo'], TRUE, NULL, TRUE, TRUE));
+ }
+ }
+ return TRUE;
+ }
+
+ /**
+ * @param int $startId
+ * @param int $endId
+ * @return CRM_Core_DAO columns include "id" and "image_URL"
+ */
+ public static function findContactImageUrls($startId, $endId) {
+ $sql = "
+SELECT id, image_url
+FROM civicrm_contact
+WHERE 1
+AND id BETWEEN %1 AND %2
+AND image_URL IS NOT NULL
+";
+
+ $params = array(
+ 1 => array($startId, 'Integer'),
+ 2 => array($endId, 'Integer'),
+ );
+ $dao = CRM_Core_DAO::executeQuery($sql, $params, TRUE, NULL, FALSE, FALSE);
+ return $dao;
+ }
+
+ /**
+ * @param int $cid
+ * @param string $newImageUrl
+ */
+ public static function setContactImageUrl($cid, $newImageUrl) {
+ $sql = 'UPDATE civicrm_contact SET image_url=%1 WHERE id=%2';
+ $params = array(
+ 1 => array($newImageUrl, 'String'),
+ 2 => array($cid, 'Integer'),
+ );
+ $updatedao = CRM_Core_DAO::executeQuery($sql, $params);
+ }
+
/**
* Update activity contacts CRM-12274
*
*
* @return bool TRUE for success
*/
- static function activityContacts(CRM_Queue_TaskContext $ctx) {
+ public static function activityContacts(CRM_Queue_TaskContext $ctx) {
$upgrade = new CRM_Upgrade_Form();
$activityContacts = CRM_Core_OptionGroup::values('activity_contacts', FALSE, FALSE, FALSE, NULL, 'name');
* @return bool TRUE for success
* @see http://issues.civicrm.org/jira/browse/CRM-13187
*/
- static function wordReplacements(CRM_Queue_TaskContext $ctx) {
+ public static function wordReplacements(CRM_Queue_TaskContext $ctx) {
$query = "
CREATE TABLE IF NOT EXISTS `civicrm_word_replacement` (
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'Word replacement ID',
* @return bool TRUE for success
* @see http://issues.civicrm.org/jira/browse/CRM-13655
*/
- static function wordReplacements_patch(CRM_Queue_TaskContext $ctx, $rev) {
+ public static function wordReplacements_patch(CRM_Queue_TaskContext $ctx, $rev) {
if (CRM_Core_DAO::checkConstraintExists('civicrm_word_replacement', 'UI_find')) {
CRM_Core_DAO::executeQuery("ALTER TABLE civicrm_word_replacement DROP FOREIGN KEY FK_civicrm_word_replacement_domain_id;");
CRM_Core_DAO::executeQuery("ALTER TABLE civicrm_word_replacement DROP KEY FK_civicrm_word_replacement_domain_id;");
/**
* (Queue Task Callback)
*/
- static function task_4_4_x_runSql(CRM_Queue_TaskContext $ctx, $rev) {
+ public static function task_4_4_x_runSql(CRM_Queue_TaskContext $ctx, $rev) {
$upgrade = new CRM_Upgrade_Form();
$upgrade->processSQL($rev);
* @return array Each item is $params for WordReplacement.create
* @see CRM_Core_BAO_WordReplacement::convertConfigArraysToAPIParams
*/
- static function getConfigArraysAsAPIParams($rebuildEach) {
+ public static function getConfigArraysAsAPIParams($rebuildEach) {
$wordReplacementCreateParams = array();
// get all domains
$result = civicrm_api3('domain', 'get', array(
* @param array $params
* @return bool TRUE if $params is valid
*/
- static function isValidWordReplacement($params) {
- $result = strlen($params['find_word']) <= self::MAX_WORD_REPLACEMENT_SIZE && strlen($params['replace_word']) > self::MAX_WORD_REPLACEMENT_SIZE;
+ public static function isValidWordReplacement($params) {
+ $result = strlen($params['find_word']) <= self::MAX_WORD_REPLACEMENT_SIZE && strlen($params['replace_word']) <= self::MAX_WORD_REPLACEMENT_SIZE;
if (!$result) {
CRM_Core_Error::debug_var('invalidWordReplacement', $params);
}