From f059abf5a846345066e7e307d17582f9fd4ac9a0 Mon Sep 17 00:00:00 2001 From: Marc Michalsky Date: Tue, 5 Oct 2021 17:20:37 +0200 Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=91=BE=20bug=20fix:=20wrong=20parent?= =?UTF-8?q?=20TwingleProject=20id's?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CRM/TwingleCampaign/BAO/TwingleCampaign.php | 14 ++++++++------ .../Exceptions/TwingleCampaignException.php | 8 ++++++++ api/v3/TwingleCampaign/Create.php | 16 ++++------------ 3 files changed, 20 insertions(+), 18 deletions(-) create mode 100644 CRM/TwingleCampaign/Exceptions/TwingleCampaignException.php diff --git a/CRM/TwingleCampaign/BAO/TwingleCampaign.php b/CRM/TwingleCampaign/BAO/TwingleCampaign.php index 1c035b9..1e773c2 100644 --- a/CRM/TwingleCampaign/BAO/TwingleCampaign.php +++ b/CRM/TwingleCampaign/BAO/TwingleCampaign.php @@ -2,6 +2,7 @@ use CRM_TwingleCampaign_Utils_ExtensionCache as ExtensionCache; use CRM_TwingleCampaign_ExtensionUtil as E; +use CRM_TwingleCampaign_Exceptions_TwingleCampaignException as TwingleCampaignException; class CRM_TwingleCampaign_BAO_TwingleCampaign { @@ -23,6 +24,7 @@ class CRM_TwingleCampaign_BAO_TwingleCampaign { * @param array $values * * @throws \CiviCRM_API3_Exception + * @throws \CRM_TwingleCampaign_Exceptions_TwingleCampaignException */ public function __construct(array $values = []) { @@ -86,6 +88,7 @@ class CRM_TwingleCampaign_BAO_TwingleCampaign { * deleted. * * @throws \CiviCRM_API3_Exception + * @throws \CRM_TwingleCampaign_Exceptions_TwingleCampaignException */ private function getParentProject(): void { @@ -96,8 +99,7 @@ class CRM_TwingleCampaign_BAO_TwingleCampaign { // Determine the parent project id by looping through the campaign tree // until the parent campaign type is a TwingleProject - $parent_id = $this->values['parent_id']; - $parent_id = $parent_id ?? civicrm_api3( + $parent_id = $this->values['parent_id'] ?? civicrm_api3( 'TwingleCampaign', 'getsingle', ['id' => $this->id] @@ -117,7 +119,7 @@ class CRM_TwingleCampaign_BAO_TwingleCampaign { } $parent_campaign_type_id = $parent_campaign['campaign_type_id']; - if (isset($parent_campaign['parent_id'])) { + if ($parent_campaign_type_id != $twingle_project_campaign_type_id && isset($parent_campaign['parent_id'])) { $parent_id = $parent_campaign['parent_id']; } else { @@ -167,7 +169,7 @@ class CRM_TwingleCampaign_BAO_TwingleCampaign { ' could not determine parent TwingleProject URL.', $this->getResponse() ); - $this->delete(); + throw new TwingleCampaignException('Parent project URL missing'); } } @@ -180,7 +182,7 @@ class CRM_TwingleCampaign_BAO_TwingleCampaign { ts('No parent TwingleProject found'), 'alert' ); - $this->delete(); + throw new TwingleCampaignException('No parent TwingleProject found'); } } @@ -288,7 +290,7 @@ class CRM_TwingleCampaign_BAO_TwingleCampaign { } catch (CiviCRM_API3_Exception $e) { Civi::log()->error( E::LONG_NAME . - ' could delete TwingleCampaign: ' . + ' could not delete TwingleCampaign: ' . $e->getMessage(), $this->getResponse() ); diff --git a/CRM/TwingleCampaign/Exceptions/TwingleCampaignException.php b/CRM/TwingleCampaign/Exceptions/TwingleCampaignException.php new file mode 100644 index 0000000..0f99555 --- /dev/null +++ b/CRM/TwingleCampaign/Exceptions/TwingleCampaignException.php @@ -0,0 +1,8 @@ +create(TRUE); return civicrm_api3_create_success( $campaign->getResponse('TwingleCampaign created'), @@ -74,15 +73,8 @@ function civicrm_api3_twingle_campaign_Create(array $params): array { 'Create' ); } catch(Exception $e){ - Civi::log()->error( - E::LONG_NAME . - ' could not create TwingleCampaign: ' . - $e->getMessage(), - $campaign->getResponse() - ); return civicrm_api3_create_error( - 'Could not create TwingleCampaign: ' . $e->getMessage(), - $campaign->getResponse() + 'Could not create TwingleCampaign: ' . $e->getMessage() ); } From a01367a161fd12c4ab6799c7859c4cba2135dcd4 Mon Sep 17 00:00:00 2001 From: Marc Michalsky Date: Wed, 6 Oct 2021 15:14:32 +0200 Subject: [PATCH 2/3] =?UTF-8?q?=E2=9C=A8=20make=20TwingleCampaings=20clona?= =?UTF-8?q?ble?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TwingleCampaings can be cloned. Cloned campaigns will generate a new cid and url. --- CRM/TwingleCampaign/BAO/TwingleCampaign.php | 31 ++++++++++---------- api/v3/TwingleCampaign/Create.php | 7 +++++ l10n/de_DE/LC_MESSAGES/de_DE.mo | Bin 21914 -> 22243 bytes l10n/de_DE/LC_MESSAGES/de_DE.po | 21 +++++++++++-- l10n/pot/twinglecampaign.pot | 12 ++++++++ twinglecampaign.php | 13 ++++++++ 6 files changed, 66 insertions(+), 18 deletions(-) diff --git a/CRM/TwingleCampaign/BAO/TwingleCampaign.php b/CRM/TwingleCampaign/BAO/TwingleCampaign.php index 1e773c2..2cbc865 100644 --- a/CRM/TwingleCampaign/BAO/TwingleCampaign.php +++ b/CRM/TwingleCampaign/BAO/TwingleCampaign.php @@ -32,15 +32,30 @@ class CRM_TwingleCampaign_BAO_TwingleCampaign { $this->id = $values['id'] ?? NULL; $this->values['campaign_type_id'] = 'twingle_campaign'; + // If there is already an ID for this TwingleProject, get its values from + // the database if ($this->id != NULL) { $this->fetch($this->id); } + + // Update the campaign values $this->update($values); + // Get the parent TwingleProject + // (it doesn't matter how many levels above in the campaign tree it is) $this->getParentProject(); - if (!isset($this->values['cid'])) { + + // If this is a new TwingleCampaign or if it is a cloned TwingleCampaign, + // calculate a cid + if ( + !isset($this->values['cid']) || + (isset($values['clone']) && $values['clone']) + ) { $this->createCid(); } + + // Create an url from the parent TwingleProject url and the cid of this + // TwingleCampaign $this->createUrl(); } @@ -351,20 +366,6 @@ class CRM_TwingleCampaign_BAO_TwingleCampaign { } } - /** - * ## Clone this TwingleProject - * - * This method removes the id from this instance and in the next step it - * creates the clone as a new TwingleCampaign with the same values to - * Twingle. - * - * @throws \CiviCRM_API3_Exception - */ - public - function clone() { - // TODO: implement cloning - } - /** * ## Get ID * diff --git a/api/v3/TwingleCampaign/Create.php b/api/v3/TwingleCampaign/Create.php index d4d9db8..e42c00a 100644 --- a/api/v3/TwingleCampaign/Create.php +++ b/api/v3/TwingleCampaign/Create.php @@ -40,6 +40,13 @@ function _civicrm_api3_twingle_campaign_Create_spec(array &$spec) { 'api.required' => 1, 'description' => E::ts('Optional parent id for this Campaign'), ]; + $spec['clone'] = [ + 'name' => 'clone', + 'title' => E::ts('Clone'), + 'type' => CRM_Utils_Type::T_BOOLEAN, + 'api.required' => 0, + 'description' => E::ts('Set this value to true if this campaign is about to be cloned to recreate cid'), + ]; } diff --git a/l10n/de_DE/LC_MESSAGES/de_DE.mo b/l10n/de_DE/LC_MESSAGES/de_DE.mo index b69812f675d2a02221adb4e10593c4952663004a..7a64892cd08c3b980950268790513f050bc27c62 100644 GIT binary patch delta 6170 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 F`#W^rzcl~= delta 5886 zcmZA533yId0><$ZNysWfh^-{{AQF*SVy{Gl*dn%AgNQu{V*gY-l+Z!6igq%HovMbR zGq$2t%goRkYiUQ&T4!igOKJb_caLX0bD!s(-#Pc*@1Aqda${Pw-DA~O57*VwUhfzV ze-C3S<0KzrGAW-brL)G2C}+%Y9EoXo8k4bJs4=hpE;<7(;y& zR>Kb*UFMKIQDiM%!I(ze5P`lp0E=TL(l;~Cp3lKx>aU~vnuh^cfS$M$b^mVb0qZgA zX}2z8E>bALjn_~=yp8^NA4Bj7^3o=#qA`J33(H_Emc%6FrA==vjalf0bFnAR$GLa~ z^&*2SIoC7MllILR3hKak)EiAjy~#rB3TpwX!JVl44&gBT5+kt*^CvTKD&}DW40wfM z$L6S^-+*fGIJ#6gL!k~{M9o>TDozIiaW?gen1m~_9bU8NYgKj5uScD~kNSN~m@(C{ zC3<5zs+~;K3uIvg&JHs!_t0+QL?R~+qHgpKcX}F#8nS5A95+FYOp>)H(q}WoUY~UZaC{R*nR?_Cr$XC-Pl4aK1rUp&TQd(;nSphjS>t>>W^ z^;M`{l8+kd%~%U}pq_IM)uC%vubRd%OQsg8W3KiT+ED0@YH%5L$786Gsle0Jz*yAK z=Ac&leAEc!+wjHm7kKs_fIH8NGv7aQAp8&n5+ zqw7@)nH1=(*@EifS@g%ts4v=gs1bUC8uDUHwC?l4WDG(z*dNu6k9{3I(M|EsaykiEcW20?78-uA&Lzf!Lr65gwisE%w#4SiK^Qp1U;j&{aKOhHZAoR*Bg3X3?Ai|=7~ ztickNQ&8u>u=P}0(fJLik@*?fp{7(DXR2DG8tjPWF$J|7Mq^prf*tS>YKr~Zx}0qm z!jji&Z-v@!iKrn@vyMcK#8i8I83s|`i2ZR7YHft@IaR|ot*uatu{Vyv)mR68I9VGT zx+rLS^hFKP5Y&idqB@jq>(i0nnt50akE0glT~vcU3C^2`qvk#WHI-4Q`&uA7*z`fQ zmy3D<*K!JaKmqCp`)&OMYAB0PKe&S$ksr|uJrkWd_CdXQ1JoO}#wwVJm2n>GIqQ(w zGFwq2b_dh6|C89Y9-W&v_`G^PFNQQqTXNuvUAN!R7cNPFQGT} zB5aDcP%l_5$vGc|1GWF-C}?pkN6q~fWI>yQs5gF!>VO|BN7u`thO{1X$-IWzPD@a0 zWG#l_K70kQphoy9`eH~&=U+-yuqy4FP88JB(O4TNpoVm%J--Fjk&jRf9Yl@H8B~Lh zum%Qoa{lcXi&{JVP}_P4>dnVvIhO%ot*|-q7U_Ms0R9C2^@+k zI2!f91NQs{)MES=^_&~1H++U+7(%OB^>L`(GXgagTTw4~vHyRzrrZIj@mvUJ)H-|Slgi1L>JT=>4n-ogHdZ|IO;iB7=&|B_bovWeEF!Z z{jbB1D+Nx`y;aonl0*;qt3B_2kY2!T|7!A z+q!s2rjp^RaNH&FM6Y~`=ndmZ0XS@VC63?MP&T@p@0$VH;#G1=iRx&OIjR#JYSj3)=l zZ{#}?N;1h6a*L#pWuydC7lk^$C5b9^J6WEPTqGMDH`BEIAZ=}(pr9bx1i@gl3p zZc<3*6K@*v#I@uR*-u)M@}w`(vBrVFT@AyAW=$S5ENooik#bMG3XfDe5mb1&-d?Z5 z9nnRef#WhKr)OqFre>s%jStKFG&U $campaign_id, 'clone' => true] + ); + CRM_Utils_System::setUFMessage(E::ts('TwingleCampaign was cloned.')); + } catch (CiviCRM_API3_Exception $e) { + Civi::log()->error( + 'twinglecampaign_postSave_callback ' . $e->getMessage() + ); + } + } } // If a TwingleProject is getting saved From 8b493c53725690cde55776934bf6d155000a1b58 Mon Sep 17 00:00:00 2001 From: Marc Michalsky Date: Wed, 6 Oct 2021 15:15:56 +0200 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=91=BE=20bug=20fix:=20undefined=20ind?= =?UTF-8?q?ex=20in=20twinglecampaign.php?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- twinglecampaign.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/twinglecampaign.php b/twinglecampaign.php index 195ceb4..bda4f1d 100644 --- a/twinglecampaign.php +++ b/twinglecampaign.php @@ -82,7 +82,11 @@ function twinglecampaign_civicrm_postSave_civicrm_campaign($dao) { $_SESSION['CiviCRM']['de.forumzfd.twinglecampaign']['no_hook'] != TRUE) { // If request is not an API-Call - if ($_GET['action'] != 'create' && $_POST['action'] != 'create') { + if ( + ((isset($_GET['action']) && $_GET['action'] != 'create') || + (isset($_POST['action']) && $_POST['action'] != 'create')) || + (!isset($_GET['action']) && !isset($_POST['action'])) + ) { // If the db transaction is still running, add a function to it that will // be called afterwards