Browse Source

Add extra fields for schedule announcements see BT#14125

jmontoyaa 7 years ago
parent
commit
902f0c6ba7

+ 16 - 7
main/inc/ajax/extra_field.ajax.php

@@ -6,14 +6,26 @@ use Chamilo\CoreBundle\Entity\Tag;
 require_once __DIR__.'/../global.inc.php';
 
 $action = isset($_GET['a']) ? $_GET['a'] : '';
+$type = isset($_REQUEST['type']) ? $_REQUEST['type'] : null;
+$fieldId = isset($_REQUEST['field_id']) ? $_REQUEST['field_id'] : null;
 
 switch ($action) {
+    case 'delete_file':
+        api_protect_admin_script();
+
+        $itemId = isset($_REQUEST['item_id']) ? $_REQUEST['item_id'] : null;
+        $extraFieldValue = new ExtraFieldValue($type);
+        $data = $extraFieldValue->get_values_by_handler_and_field_id($itemId, $fieldId);
+        if (!empty($data) && isset($data['id']) && !empty($data['value'])) {
+            $extraFieldValue->deleteValuesByHandlerAndFieldAndValue($itemId, $data['field_id'], $data['value']);
+            echo 1;
+            break;
+        }
+        echo 0;
+        break;
     case 'get_second_select_options':
-        $type = isset($_REQUEST['type']) ? $_REQUEST['type'] : null;
-        $field_id = isset($_REQUEST['field_id']) ? $_REQUEST['field_id'] : null;
         $option_value_id = isset($_REQUEST['option_value_id']) ? $_REQUEST['option_value_id'] : null;
-
-        if (!empty($type) && !empty($field_id) && !empty($option_value_id)) {
+        if (!empty($type) && !empty($fieldId) && !empty($option_value_id)) {
             $field_options = new ExtraFieldOption($type);
             echo $field_options->get_second_select_field_options_by_field(
                 $option_value_id,
@@ -23,9 +35,6 @@ switch ($action) {
         break;
     case 'search_tags':
         header('Content-Type: application/json');
-
-        $type = isset($_REQUEST['type']) ? $_REQUEST['type'] : null;
-        $fieldId = isset($_REQUEST['field_id']) ? $_REQUEST['field_id'] : null;
         $tag = isset($_REQUEST['q']) ? $_REQUEST['q'] : null;
         $result = [];
 

+ 46 - 1
main/inc/lib/ScheduledAnnouncement.php

@@ -93,13 +93,14 @@ class ScheduledAnnouncement extends Model
 
     /**
      * Returns a Form validator Obj
+     * @param int $id
      * @param   string  $url
      * @param   string  $action add, edit
      * @param array $sessionInfo
      *
      * @return  FormValidator form validator obj
      */
-    public function returnSimpleForm($url, $action, $sessionInfo = [])
+    public function returnSimpleForm($id, $url, $action, $sessionInfo = [])
     {
         $form = new FormValidator(
             'announcement',
@@ -111,6 +112,12 @@ class ScheduledAnnouncement extends Model
         $form->addDateTimePicker('date', get_lang('Date'));
         $form->addText('subject', get_lang('Subject'));
         $form->addHtmlEditor('message', get_lang('Message'));
+
+        $extraField = new ExtraField('schedule_announcement');
+        $extra = $extraField->addElements($form, $id);
+        $js = $extra['jquery_ready_content'];
+        $form->addHtml("<script> $(function() { $js }); </script> ");
+
         $this->setTagsInForm($form);
 
         $form->addCheckBox('sent', null, get_lang('MessageSent'));
@@ -241,6 +248,12 @@ class ScheduledAnnouncement extends Model
         $form->addHtml('</div>');
         $form->addText('subject', get_lang('Subject'));
         $form->addHtmlEditor('message', get_lang('Message'));
+
+        $extraField = new ExtraField('schedule_announcement');
+        $extra = $extraField->addElements($form);
+        $js = $extra['jquery_ready_content'];
+        $form->addHtml("<script> $(function() { $js }); </script> ");
+
         $this->setTagsInForm($form);
 
         if ($action == 'edit') {
@@ -252,6 +265,33 @@ class ScheduledAnnouncement extends Model
         return $form;
     }
 
+    /**
+     * @param int $id
+     * @return string
+     */
+    public function getAttachmentToString($id)
+    {
+        $file = $this->getAttachment($id);
+        if (!empty($file) && !empty($file['value'])) {
+            //$file = api_get_uploaded_web_url('schedule_announcement', $id, basename($file['value']));
+            $url = api_get_path(WEB_UPLOAD_PATH).$file['value'];
+            return get_lang('Attachment').': '.Display::url(basename($file['value']), $url);
+        }
+        return '';
+    }
+
+    /**
+     * @param int $id
+     * @return array
+     */
+    public function getAttachment($id)
+    {
+        $extraFieldValue = new ExtraFieldValue('schedule_announcement');
+        $attachment = $extraFieldValue->get_values_by_handler_and_field_variable($id, 'attachment');
+
+        return $attachment;
+    }
+
     /**
      * @param int $urlId
      *
@@ -286,8 +326,12 @@ class ScheduledAnnouncement extends Model
                         continue;
                     }
 
+                    $attachments = $this->getAttachmentToString($result['id']);
+
                     self::update(['id' => $result['id'], 'sent' => 1]);
 
+
+
                     $subject = $result['subject'];
 
                     if ($users) {
@@ -354,6 +398,7 @@ class ScheduledAnnouncement extends Model
                             ];
 
                             $message = str_replace(array_keys($tags), $tags, $message);
+                            $message .= $attachments;
 
                             MessageManager::send_message(
                                 $userInfo['user_id'],

+ 21 - 6
main/inc/lib/api.lib.php

@@ -8510,16 +8510,30 @@ function api_upload_file($type, $file, $itemId, $cropParameters = '')
  *
  * @return bool
  */
-function api_get_uploaded_file($type, $itemId, $file)
+function api_get_uploaded_web_url($type, $itemId, $file)
+{
+    return api_get_uploaded_file($type, $itemId, $file, true);
+}
+
+/**
+ * @param string $type
+ * @param int $itemId
+ * @param string $file
+ * @param bool $getUrl
+ *
+ * @return bool
+ */
+function api_get_uploaded_file($type, $itemId, $file, $getUrl = false)
 {
     $itemId = (int) $itemId;
     $pathId = '/'.substr((string) $itemId, 0, 1).'/'.$itemId.'/';
     $path = api_get_path(SYS_UPLOAD_PATH).$type.$pathId;
-
     $file = basename($file);
-
     $file = $path.'/'.$file;
-    if (file_exists($file)) {
+    if (Security::check_abs_path($file, $path) && is_file($file) && file_exists($file)) {
+        if ($getUrl) {
+            return str_replace(api_get_path(SYS_UPLOAD_PATH), api_get_path(WEB_UPLOAD_PATH), $file);
+        }
         return $file;
     }
     return false;
@@ -8549,8 +8563,9 @@ function api_download_uploaded_file($type, $itemId, $file, $title = '')
  */
 function api_remove_uploaded_file($type, $file)
 {
-    $path = api_get_path(SYS_UPLOAD_PATH).$type.'/'.$file;
-    if (file_exists($path)) {
+    $typePath = api_get_path(SYS_UPLOAD_PATH).$type;
+    $path = $typePath.'/'.$file;
+    if (Security::check_abs_path($path, $typePath) && file_exists($path) && is_file($path)) {
         unlink($path);
     }
 }

+ 49 - 9
main/inc/lib/extra_field.lib.php

@@ -141,6 +141,9 @@ class ExtraField extends Model
             case 'survey':
                 $this->extraFieldType = EntityExtraField::SURVEY_FIELD_TYPE;
                 break;
+            case 'schedule_announcement':
+                $this->extraFieldType = EntityExtraField::SCHEDULE_ANNOUNCEMENT;
+                break;
         }
 
         $this->pageUrl = 'extra_fields.php?type='.$this->type;
@@ -161,7 +164,7 @@ class ExtraField extends Model
      */
     public static function getValidExtraFieldTypes()
     {
-        return [
+        $result = [
             'user',
             'course',
             'session',
@@ -175,6 +178,12 @@ class ExtraField extends Model
             'user_certificate',
             'survey'
         ];
+
+        if (api_get_configuration_value('allow_scheduled_announcements')) {
+            $result[] = 'schedule_announcement';
+        }
+
+        return $result;
     }
 
     /**
@@ -1655,8 +1664,8 @@ class ExtraField extends Model
                         break;
                     case self::FIELD_TYPE_SELECT_MULTIPLE:
                         $options = [];
-                        foreach ($field_details['options'] as $option_id => $option_details) {
-                            $options[$option_details['option_value']] = $option_details['display_text'];
+                        foreach ($field_details['options'] as $optionDetails) {
+                            $options[$optionDetails['option_value']] = $optionDetails['display_text'];
                         }
                         $form->addElement(
                             'select',
@@ -1951,12 +1960,12 @@ class ExtraField extends Model
                         $form->applyFilter('extra_'.$field_details['variable'], 'stripslashes');
                         $form->applyFilter('extra_'.$field_details['variable'], 'trim');
 
-                        $allowed_picture_types = ['jpg', 'jpeg', 'png', 'gif'];
+                        $allowedPictureTypes = ['jpg', 'jpeg', 'png', 'gif'];
                         $form->addRule(
                             'extra_'.$field_details['variable'],
-                            get_lang('OnlyImagesAllowed').' ('.implode(',', $allowed_picture_types).')',
+                            get_lang('OnlyImagesAllowed').' ('.implode(',', $allowedPictureTypes).')',
                             'filetype',
-                            $allowed_picture_types
+                            $allowedPictureTypes
                         );
 
                         if ($freezeElement) {
@@ -1989,14 +1998,45 @@ class ExtraField extends Model
                             array_key_exists($fieldVariable, $extraData)
                         ) {
                             if (file_exists(api_get_path(SYS_UPLOAD_PATH).$extraData[$fieldVariable])) {
-                                $fieldTexts[] = Display::url(
-                                    api_get_path(WEB_UPLOAD_PATH).$extraData[$fieldVariable],
+                                $linkToDelete = '';
+                                $divItemId = $field_details['variable'];
+                                if (api_is_platform_admin()) {
+                                    $url = api_get_path(WEB_AJAX_PATH).'extra_field.ajax.php?type='.$this->type;
+                                    $url .= '&a=delete_file&field_id='.$field_details['id'].'&item_id='.$itemId;
+
+                                    $deleteId = $field_details['variable'].'_delete';
+                                    $form->addHtml("
+                                        <script>
+                                            $(document).ready(function() {                                      
+                                                $('#".$deleteId."').on('click', function() {
+                                                    $.ajax({			
+                                                        type: 'GET',
+                                                        url: '".$url."',			
+                                                        success: function(result) {		    
+                                                            if (result == 1) {
+                                                                $('#".$divItemId."').html('".get_lang('Deleted')."');
+                                                            }			    
+                                                        }
+                                                    });
+                                                });
+                                            });
+                                        </script>
+                                    ");
+
+                                    $linkToDelete = '&nbsp;'.Display::url(
+                                        Display::return_icon('delete.png', get_lang('Delete')),
+                                        'javascript:void(0)',
+                                        ['id' => $deleteId]
+                                    );
+                                }
+                                $fieldTexts[] = '<div id="'.$divItemId.'">'.Display::url(
+                                    basename($extraData[$fieldVariable]),
                                     api_get_path(WEB_UPLOAD_PATH).$extraData[$fieldVariable],
                                     [
                                         'title' => $field_details['display_text'],
                                         'target' => '_blank'
                                     ]
-                                );
+                                ).$linkToDelete.'</div>';
                             }
                         }
 

+ 21 - 5
main/inc/lib/extra_field_value.lib.php

@@ -278,6 +278,10 @@ class ExtraFieldValue extends Model
                             $fileDir = api_get_path(SYS_UPLOAD_PATH).'work/';
                             $fileDirStored = "work/";
                             break;
+                        case 'schedule_announcement':
+                            $fileDir = api_get_path(SYS_UPLOAD_PATH).'schedule_announcement/';
+                            $fileDirStored = 'schedule_announcement/';
+                            break;
                     }
 
                     $cleanedName = api_replace_dangerous_char($value['name']);
@@ -396,12 +400,11 @@ class ExtraFieldValue extends Model
                 case ExtraField::FIELD_TYPE_DOUBLE_SELECT:
                 case ExtraField::FIELD_TYPE_SELECT_WITH_TEXT_FIELD:
                     if (is_array($value)) {
+                        $value_to_insert = null;
                         if (isset($value['extra_'.$extraFieldInfo['variable']]) &&
                             isset($value['extra_'.$extraFieldInfo['variable'].'_second'])
                         ) {
                             $value_to_insert = $value['extra_'.$extraFieldInfo['variable']].'::'.$value['extra_'.$extraFieldInfo['variable'].'_second'];
-                        } else {
-                            $value_to_insert = null;
                         }
                     }
                     break;
@@ -982,20 +985,33 @@ class ExtraFieldValue extends Model
      * @param int $itemId
      * @param int $fieldId
      * @param int $fieldValue
+     *
+     * @return bool
      */
     public function deleteValuesByHandlerAndFieldAndValue($itemId, $fieldId, $fieldValue)
     {
         $itemId = intval($itemId);
         $fieldId = intval($fieldId);
-        $fieldValue = Database::escape_string($fieldValue);
 
-        $sql = "DELETE FROM {$this->table}
+        $fieldData = $this->getExtraField()->get($fieldId);
+        if ($fieldData) {
+            $fieldValue = Database::escape_string($fieldValue);
+
+            $sql = "DELETE FROM {$this->table}
                 WHERE
                     item_id = '$itemId' AND
                     field_id = '$fieldId' AND
                     value = '$fieldValue'
                 ";
-        Database::query($sql);
+            Database::query($sql);
+
+            // Delete file from uploads
+            if ($fieldData['field_type'] == ExtraField::FIELD_TYPE_FILE) {
+                api_remove_uploaded_file($this->type, basename($fieldValue));
+            }
+            return true;
+        }
+        return false;
     }
 
     /**

+ 4 - 3
main/inc/lib/model.lib.php

@@ -51,14 +51,15 @@ class Model
      */
     public function delete($id)
     {
-        if (empty($id) or $id != strval(intval($id))) {
+        if (empty($id) || $id != strval(intval($id))) {
             return false;
         }
         $params = ['id = ?' => $id];
         if ($this->is_course_model) {
-            $course_id = api_get_course_int_id();
-            $params = ['id = ? AND c_id = ?' => [$id, $course_id]];
+            $courseId = api_get_course_int_id();
+            $params = ['id = ? AND c_id = ?' => [$id, $courseId]];
         }
+
         // Database table definition
         $result = Database::delete($this->table, $params);
         if ($result != 1) {

+ 13 - 3
main/session/scheduled_announcement.php

@@ -100,6 +100,10 @@ switch ($action) {
             $res = $object->save($values);
 
             if ($res) {
+                $extraFieldValue = new ExtraFieldValue('schedule_announcement');
+                $values['item_id'] = $res;
+                $extraFieldValue->saveFieldValues($values);
+
                 Display::addFlash(
                     Display::return_message(
                         get_lang('ItemAdded'),
@@ -122,8 +126,8 @@ switch ($action) {
         break;
     case 'edit':
         // Action handling: Editing
-        $url  = api_get_self().'?action='.Security::remove_XSS($_GET['action']).'&id='.intval($_GET['id']).'&session_id='.$sessionId;
-        $form = $object->returnSimpleForm($url, 'edit', $sessionInfo);
+        $url  = api_get_self().'?action='.Security::remove_XSS($_GET['action']).'&id='.$id.'&session_id='.$sessionId;
+        $form = $object->returnSimpleForm($id, $url, 'edit', $sessionInfo);
         if ($form->validate()) {
             $values = $form->getSubmitValues();
             $values['id'] = $id;
@@ -131,10 +135,16 @@ switch ($action) {
             $values['date'] = api_get_utc_datetime($values['date']);
             $res = $object->update($values);
 
+            $extraFieldValue = new ExtraFieldValue('schedule_announcement');
+            $values['item_id'] = $id;
+            $extraFieldValue->saveFieldValues($values);
+
             Display::addFlash(Display::return_message(
                 get_lang('Updated'),
                 'confirmation'
             ));
+            header("Location: $url");
+            exit;
         }
         $item = $object->get($id);
         $item['date'] = api_get_local_time($item['date']);
@@ -142,7 +152,7 @@ switch ($action) {
         $content = $form->returnForm();
         break;
     case 'delete':
-        $object->delete($_GET['id']);
+        $object->delete($id);
         $content = $object->getGrid($sessionId);
         break;
     default: