diff --git a/src/IDF/FileUtil.php b/src/IDF/FileUtil.php index 725d980..c9ec8e9 100644 --- a/src/IDF/FileUtil.php +++ b/src/IDF/FileUtil.php @@ -162,4 +162,15 @@ class IDF_FileUtil $ext = array_merge(self::$supportedExtenstions, explode(' ' , $ext)); return (in_array($fileinfo[2], $ext)); } + + /* + * + */ + public static function getPictureInline($file) + { + $info = IDF_FileUtil::getMimeType($file); + $content = file_get_contents($file); + $base64 = 'data:' . $info[0] . ';base64,' . base64_encode($content); + return $base64; + } } diff --git a/src/IDF/Form/ProjectConf.php b/src/IDF/Form/ProjectConf.php new file mode 100644 index 0000000..1a3bd45 --- /dev/null +++ b/src/IDF/Form/ProjectConf.php @@ -0,0 +1,141 @@ +project = $extra['project']; + + // Basic part + $this->fields['name'] = new Pluf_Form_Field_Varchar(array('required' => true, + 'label' => __('Name'), + 'initial' => $this->project->name, + )); + $this->fields['shortdesc'] = new Pluf_Form_Field_Varchar(array('required' => true, + 'label' => __('Short Description'), + 'initial' => $this->project->shortdesc, + 'widget_attrs' => array('size' => '68'), + )); + $this->fields['description'] = new Pluf_Form_Field_Varchar(array('required' => true, + 'label' => __('Description'), + 'initial' => $this->project->description, + 'widget_attrs' => array('cols' => 68, + 'rows' => 26, + ), + 'widget' => 'Pluf_Form_Widget_TextareaInput', + )); + + // Logo part + $upload_path = Pluf::f('upload_path', false); + if(false === $upload_path) { + throw new Pluf_Exception_SettingError(__('The "upload_issue_path" configuration variable was not set.')); + } + $md5 = md5(rand().microtime().Pluf_Utils::getRandomString()); + $filename = substr($md5, 0, 2).'/'.substr($md5, 2, 2).'/'.substr($md5, 4).'/%s'; + $this->fields['logo'] = new Pluf_Form_Field_File(array('required' => false, + 'label' => __('Update the logo'), + 'initial' => '', + 'help_text' => __('The logo must be a picture with a size of 16 by 16.'), + 'max_size' => Pluf::f('max_upload_size', 2097152), + 'move_function_params' => + array('upload_path' => $upload_path, + 'upload_path_create' => true, + 'file_name' => $filename, + ) + )); + + $this->fields['logo_remove'] = new Pluf_Form_Field_Boolean(array('required' => false, + 'label' => __('Remove the current logo'), + 'initial' => false, + 'widget' => 'Pluf_Form_Widget_CheckboxInput', + )); + } + + /** + * If we have uploaded a file, but the form failed remove it. + * + */ + function failed() + { + if(!empty($this->cleaned_data['logo']) + and file_exists(Pluf::f('upload_path').'/'.$this->cleaned_data['logo'])) { + unlink(Pluf::f('upload_path').'/'.$this->cleaned_data['logo']); + } + } + + public function clean() + { + if(!isset($this->cleaned_data['logo_remove'])) { + $this->cleaned_data['logo_remove'] = false; + } + + return $this->cleaned_data; + } + + public function clean_logo() + { + if(!isset($this->cleaned_data['logo']) || + $this->cleaned_data['logo'] == "") { + return ''; + } + + $meta = getimagesize(Pluf::f('upload_path').'/'.$this->cleaned_data['logo']); + + if($meta === FALSE) { + throw new Pluf_Form_Invalid("Error during the determination of the size of the picture"); + } + + if($meta[0] !== 32 || $meta[1] !== 32) { + throw new Pluf_Form_Invalid("The picture must have a size of 16 by 16."); + } + + return $this->cleaned_data['logo']; + } + + public function save($commit=true) + { + $conf = $this->project->getConf(); + + // Basic part + $this->project->name = $this->cleaned_data['name']; + $this->project->shortdesc = $this->cleaned_data['shortdesc']; + $this->project->description = $this->cleaned_data['description']; + $this->project->update(); + + // Logo part + if($this->cleaned_data['logo'] !== "") { + $conf->setVal('logo', $this->cleaned_data['logo']); + } + if($this->cleaned_data['logo_remove'] === true) { + @unlink(Pluf::f('upload_path').'/'.$conf->getVal('logo')); + $conf->delVal('logo'); + } + } +} diff --git a/src/IDF/Views.php b/src/IDF/Views.php index 208299e..8dc92b7 100644 --- a/src/IDF/Views.php +++ b/src/IDF/Views.php @@ -41,12 +41,24 @@ class IDF_Views { $projects = self::getProjects($request->user); $stats = self::getProjectsStatistics ($projects); + + $logos = array(); + foreach ($projects as $p) { + $logo = $p->getConf()->getVal('logo'); + if (!empty($logo)) { + $logo = Pluf::f('upload_path').'/'.$logo; + $logos[$p->shortname] = IDF_FileUtil::getPictureInline($logo); + } else { + $logos[$p->shortname] = ""; + } + } if ($api == true) return $projects; return Pluf_Shortcuts_RenderToResponse('idf/index.html', array('page_title' => __('Projects'), 'projects' => $projects, - 'stats' => new Pluf_Template_ContextVars($stats)), + 'stats' => new Pluf_Template_ContextVars($stats), + 'logos' => $logos), $request); } diff --git a/src/IDF/Views/Project.php b/src/IDF/Views/Project.php index cb071b1..d78dd9c 100644 --- a/src/IDF/Views/Project.php +++ b/src/IDF/Views/Project.php @@ -283,12 +283,17 @@ class IDF_Views_Project $form = new IDF_Form_ProjectConf($prj->getData(), $extra); } + $logo = $prj->getConf()->getVal('logo'); + if (!empty($logo)) { + $logo = Pluf::f('upload_path').'/'.$logo; + $logo_base64 = IDF_FileUtil::getPictureInline($logo); + } return Pluf_Shortcuts_RenderToResponse('idf/admin/summary.html', array( 'page_title' => $title, 'form' => $form, 'project' => $prj, - 'upload_path' => Pluf::f('upload_path'), + 'logo' => $logo_base64, ), $request); } diff --git a/src/IDF/templates/idf/admin/summary.html b/src/IDF/templates/idf/admin/summary.html index 1c012bb..9653ede 100644 --- a/src/IDF/templates/idf/admin/summary.html +++ b/src/IDF/templates/idf/admin/summary.html @@ -33,8 +33,8 @@ {trans 'Actual logo'}: -{if $project.logo} -project logo +{if $logo} +project logo {else} {trans 'Your project do not have a logo configured yet.'} {/if} @@ -46,7 +46,7 @@ {$form.f.logo|unsafe} -{if $project.logo} +{if $logo} {$form.f.logo_remove.labelTag}: {if $form.f.logo_remove.errors}{$form.f.logo_remove.fieldErrors}{/if} diff --git a/src/IDF/templates/idf/index.html b/src/IDF/templates/idf/index.html index a2f5abd..5f70957 100644 --- a/src/IDF/templates/idf/index.html +++ b/src/IDF/templates/idf/index.html @@ -12,8 +12,8 @@ {foreach $projects as $p}
- {if $p.logo != 0} - {trans 'Project logo'} + {if $logos[$p->shortname]} + {trans 'Project logo'} {else} {trans 'Project logo'} {/if}