-
Notifications
You must be signed in to change notification settings - Fork 225
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
NEW DB column showing if file is userform upload
- UserFormUpload used by File::isTrackedFormUpload()
- Loading branch information
1 parent
e54a825
commit 2d3f95c
Showing
6 changed files
with
140 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
<?php | ||
|
||
namespace SilverStripe\UserForms\Extension; | ||
|
||
use SilverStripe\Assets\File; | ||
use SilverStripe\Assets\Folder; | ||
use SilverStripe\Core\Convert; | ||
use SilverStripe\ORM\DataExtension; | ||
use SilverStripe\ORM\DataObject; | ||
use SilverStripe\ORM\Queries\SQLUpdate; | ||
use SilverStripe\UserForms\Control\UserDefinedFormController; | ||
use SilverStripe\UserForms\Model\Submission\SubmittedFileField; | ||
use SilverStripe\Versioned\Versioned; | ||
|
||
/** | ||
* @method File SubmittedFileField | ||
*/ | ||
class UserFormFileExtension extends DataExtension | ||
{ | ||
|
||
public const USER_FORM_UPLOAD_UNKNOWN = null; | ||
|
||
public const USER_FORM_UPLOAD_FALSE = 'f'; | ||
|
||
public const USER_FORM_UPLOAD_TRUE = 't'; | ||
|
||
private static $db = [ | ||
'UserFormUpload' => "Enum('f, t', null)", | ||
]; | ||
|
||
private static $belongs_to = [ | ||
'SubmittedFileField' => SubmittedFileField::class | ||
]; | ||
|
||
/** | ||
* Check if the file is associated with a userform submission | ||
* Save the result in the database as a tri-state for two reasons: | ||
* a) performance - prevent the need for an extra DB query | ||
* b) if in the future the UserForm submission is deleted and the uploaded file is not (file is orphaned), | ||
* then it is still recorded that the file was originally uploaded from a userform submission | ||
* | ||
* @param bool $value | ||
* @see File::isTrackedFormUpload(), UserDefinedFormController::process() | ||
*/ | ||
public function updateTrackedFormUpload(&$value): void | ||
{ | ||
/** @var File|Versioned|UserFormFileExtension $file */ | ||
$file = $this->owner; | ||
if ($file->UserFormUpload != self::USER_FORM_UPLOAD_UNKNOWN) { | ||
$value = $file->UserFormUpload == self::USER_FORM_UPLOAD_TRUE; | ||
return; | ||
} | ||
if ($file->ClassName == Folder::class) { | ||
$value = false; | ||
} else { | ||
$value = $file->SubmittedFileField()->exists(); | ||
} | ||
$this->updateDB($value); | ||
} | ||
|
||
/** | ||
* Update File.UserFormUpload draft table without altering File.LastEdited | ||
* | ||
* @param bool $value | ||
*/ | ||
private function updateDB(bool $value): void | ||
{ | ||
if (!$this->owner->isInDB()) { | ||
return; | ||
} | ||
$tableName = Convert::raw2sql(DataObject::getSchema()->tableName(File::class)); | ||
$column = 'UserFormUpload'; | ||
$enumVal = $value ? self::USER_FORM_UPLOAD_TRUE : self::USER_FORM_UPLOAD_FALSE; | ||
SQLUpdate::create() | ||
->setTable(sprintf('"%s"', $tableName)) | ||
->addWhere(['"ID" = ?' => [$this->owner->ID]]) | ||
->addAssignments([sprintf('"%s"', $column) => $enumVal]) | ||
->execute(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
<?php | ||
|
||
namespace SilverStripe\UserForms\Tests\Extension; | ||
|
||
use SilverStripe\Assets\File; | ||
use SilverStripe\Dev\SapphireTest; | ||
use SilverStripe\UserForms\Model\Submission\SubmittedFileField; | ||
use SilverStripe\UserForms\Extension\UserFormFileExtension; | ||
|
||
class UserFormFileExtensionTest extends SapphireTest | ||
{ | ||
protected $usesDatabase = true; | ||
|
||
public function testUpdateIsUserFormUploadFalse() | ||
{ | ||
$file = File::create(); | ||
$file->write(); | ||
$this->assertNull($file->UserFormUpload); | ||
|
||
$value = true; | ||
$file->invokeWithExtensions('updateTrackedFormUpload', $value); | ||
$this->assertFalse($value); | ||
|
||
// refresh DataObject to get latest DB changes | ||
$file = File::get()->byID($file->ID); | ||
|
||
$this->assertEquals(UserFormFileExtension::USER_FORM_UPLOAD_FALSE, $file->UserFormUpload); | ||
} | ||
|
||
public function testUpdateIsUserFormUploadTrue() | ||
{ | ||
$file = File::create(); | ||
$file->write(); | ||
$this->assertNull($file->UserFormUpload); | ||
|
||
$submittedFileField = SubmittedFileField::create(); | ||
$submittedFileField->UploadedFileID = $file->ID; | ||
$submittedFileField->write(); | ||
|
||
$value = false; | ||
$file->invokeWithExtensions('updateTrackedFormUpload', $value); | ||
$this->assertTrue($value); | ||
|
||
// refresh DataObject to get latest DB changes | ||
$file = File::get()->byID($file->ID); | ||
|
||
$this->assertEquals(UserFormFileExtension::USER_FORM_UPLOAD_TRUE, $file->UserFormUpload); | ||
} | ||
} |