has_plugin('fr.core.dynamicform')){
Plugin::need('dynamicform/DynamicForm');
//le premier argument contient le slug du formulaire contenant toutes les colonnes possibles, le second les colonnes non choisies,la requete, l'alias si nécessaire
$dynamicFields = DynamicForm::list('fiche-example');
DynamicForm::query_column_add($dynamicFields,$query,'main');
//On récupère les types de champs qui possèdent une propriété onLoad afin de l'appliquer si on a un champ dynamique
$fieldTypes = array();
foreach($dynamicFields as $field){
$fieldTypes[$field['slug']] = $field['type'];
$allowedFields[] = 'dynamicField_'.$field['id'].'.value';
}
}
//Recherche simple
if(!empty($_['filters']['keyword'])){
$query .= ' AND main.label LIKE ?';
$data[] = '%'.$_['filters']['keyword'].'%';
}
//Recherche avancée
if(isset($_['filters']['advanced'])) filter_secure_query($_['filters']['advanced'],array_merge($allowedFields,array('main.label','main.phone','main.birth','main.hour','main.firm','main.manager','main.address','main.properties','main.vehicle','main.storyshort','main.story','main.password','main.icon','main.available','main.solvability','main.handicap','main.childs','main.size','main.color','main.salary','main.orientation','main.website','main.mail','main.mobile')),$query,$data);
//Tri des colonnes
if(isset($_['sort'])) sort_secure_query($_['sort'],array_merge($allowedFields,array('main.label','main.phone','main.birth','main.hour','main.firm','main.manager','main.address','main.properties','main.vehicle','main.storyshort','main.story','main.password','main.icon','main.available','main.solvability','main.handicap','main.childs','main.size','main.color','main.salary','main.orientation','main.website','main.mail','main.mobile')),$query,$data);
//Pagination
//Par défaut pour une recherche, 20 items, pour un export 5000 max
$itemPerPage = !empty($_['itemPerPage']) ? $_['itemPerPage'] : 20;
//force le nombre de page max a 50 coté serveur
$itemPerPage = $itemPerPage>50 ? 50 : $itemPerPage;
if($_['export'] == 'true') $itemPerPage = 5000;
$response['pagination'] = ContactExample::paginate($itemPerPage,(!empty($_['page'])?$_['page']:0),$query,$data,'main');
$contacts = ContactExample::staticQuery($query,$data,true,1);
$vehicleList = Dictionary::slugToArray('example_contact_vehicle',true);
$handicapList = Dictionary::slugToArray('example_contact_handicap',true);
$response['rows'] = array();
//Mise en forme des résultats
foreach($contacts as $contact){
$row = $contact->toArray();
$row['birth-readable'] = complete_date($row['birth']).' à '.date('H:i',$row['birth']);
$user = User::byLogin($row['manager']);
$row['manager'] = $user->toArray();
$row['manager']['fullname'] = $user->fullname();
$row['manager']['avatar'] = $user->getAvatar();
$row['firm'] = $contact->join('firm')->toArray();
$row['vehicle'] = isset($vehicleList[$row['vehicle']]) ? $vehicleList[$row['vehicle']] : new Dictionary();
$row['handicaps'] = array();
foreach(explode(',',$row['handicap']) as $id){
if(empty($id)) continue;
$row['handicaps'][] = isset($handicapList[$id]) ? $handicapList[$id] : new Dictionary();
}
$row['properties'] = explode(',',$row['properties']);
$row['story'] = html_entity_decode($row['story']);
$row['solvability'] = ContactExample::solvabilities($row['solvability']);
$row['orientation'] = ContactExample::orientations($row['orientation']);
$row['cv'] = array();
foreach (glob(File::dir().'example'.SLASH.'contact'.SLASH.$row['id'].'/cv/*') as $file) {
$row['cv'][] = array(
'label' => basename($file),
'url' => 'action.php?action=example_contact_cv&type=download&path='.base64_encode('example/contact/'.$row['id'].'/cv/'.basename($file)),
);
}
$row['avatar'] = 'action.php?action=example_contact_avatar&type=download&path='.base64_encode('example/contact/'.$row['id'].'/avatar.*');
if($_['export'] == 'true'){
$row['created'] = date('d-m-Y',$row['created']);
$row['updated'] = date('d-m-Y',$row['updated']);
}
//Gestion des champs dynamiques
if($myFirm->has_plugin('fr.core.dynamicform'))
DynamicForm::search_values($row,array(
'slugs' => $contact->foreign(),
'types' => $fieldTypes,
'scope' => 'contact',
));
$response['rows'][] = $row;
}
/* Mode export */
if($_['export'] == 'true'){
if(empty($response['rows'])) $response['rows'][] = array('Vide'=>'Aucune données');
$fieldsMapping = array();
foreach (ContactExample::fields(false) as $key => $value)
$fieldsMapping[$value['label']] = $key;
$stream = Excel::exportArray($response['rows'],$fieldsMapping ,'Export');
File::downloadStream($stream,'export-contacts-'.date('d-m-Y').'.xlsx');
exit();
}
});
//Ajout ou modification d'élément contact
Action::register('example_contact_save',function(&$response){
global $_,$myFirm,$myUser;
User::check_access('example','edit');
require_once(__DIR__.SLASH.'ContactExample.class.php');
//Check champs dynamiques
if($myFirm->has_plugin('fr.core.dynamicform')){
Plugin::need('dynamicform/DynamicForm');
$dynamicFields = Dynamicform::check_required('fiche-example',array(),$_);
}
$item = ContactExample::provide();
//on garde l'ancien objet a l'instant t pour le log comparatif (voir en fin d'action)
$oldItem = clone $item;
$item->label = $_['label'];
$item->phone = $_['phone'];
$item->birth = timestamp_date($_['birth']);
$item->hour = $_['hour'];
$item->firm = $_['firm'];
$item->manager = $_['manager'];
$item->address = $_['address'];
$item->properties = $_['properties'];
if(!empty($_['vehicle']) ) $item->vehicle = $_['vehicle'];
$item->storyshort = $_['storyshort'];
$item->story = $_['story'];
$item->password = $_['password'];
$item->icon = $_['icon'];
$item->available = $_['available'];
$item->solvability = $_['solvability'];
$item->handicap = (isset($_['handicap']) && !empty($_['handicap'])) ? value_encapsulate($_['handicap'], ',') : NULL;
$item->childs = $_['childs'];
if(is_numeric($_['size'])) $item->size = $_['size'];
$item->color = $_['color'];
$item->salary = $_['salary'];
if(!empty($_['orientation'])) $item->orientation = $_['orientation'];
$item->website = $_['website'];
$item->mail = $_['mail'];
$item->save();
//save champs dynamiques
if($myFirm->has_plugin('fr.core.dynamicform')){
Dynamicform::record('fiche-example',array(
'scope'=>'contact',
'uid'=>$item->id,
'fields' => $dynamicFields
),$_);
}
//Ajout upload Cv
if(!empty($_['cv']))
File::save_component('cv', 'example/contact/'.$item->id.'/cv/{{label}}');
//Ajout upload Avatar
if(!empty($_['avatar']))
File::save_component('avatar', 'example/contact/'.$item->id.'/avatar.{{extension}}');
//Exemple de mise en place de logs comparatif
History::entityChange('contact',$oldItem,$item);
//trigger pour utilisation sur le workflow
if($myFirm->has_plugin('fr.core.workflow')){
Plugin::need('workflow/WorkflowEvent');
WorkflowEvent::trigger('example-contact-'.($oldItem->id==0?'create':'update'),array('old'=>$oldItem,'current'=>$item));
}
// GESTION ENVOI NOTIFICATION
Plugin::callHook('emit_notification',array(array(
'label' => isset($item->id) ? 'Édition d\'un contact' : 'Création d\'un contact',
'html' => isset($item->id) ? 'Le contact '.$item->label.' a été édité' : 'Création du contact '.$item->label,
'type' => "notice",
'meta' => array('link' => ROOT_URL.'/index.php?module=example&page=sheet&id='.$item->id),
'recipients' => array($myUser->login) // recipients contient login
)
));
$response = $item->toArray();
});
Action::register('contact_wysiwyg_attachments',function(&$response){
$directory = File::dir().SLASH.'public'.SLASH.'example';
User::check_access('example','read');
global $_;
if(!isset($_FILES['stream'])) throw new Exception("Fichier inexistant");
if(!in_array($_FILES['stream']['type'], array('image/png','image/jpg','image/jpeg','image/gif','image/bmp','application/pdf'))) throw new Exception("Format du fichier non autorisé :".$_FILES['stream']['type']);
$ext = mb_strtolower(getExt($_['name']));
//Gère l'upload d'un fichier image collé dans le wysiwyg
$pathes = File::upload('stream', 'example/public/screens/'.time().'.'.$ext, 1048576, null);
if(preg_match('/^image\//', $_FILES['stream']['type'])){
$response['html'] = '';
}else{
$response['html'] = ''.$_['name'].'';
}
});
//Suppression d'élement contact
Action::register('example_contact_delete',function(&$response){
global $myUser,$_,$myFirm;
User::check_access('example','delete');
require_once(__DIR__.SLASH.'ContactExample.class.php');
if(empty($_['id']) || !is_numeric($_['id'])) throw new Exception("Identifiant incorrect");
ContactExample::deleteById($_['id']);
//Gestion des champs dynamiques
if($myFirm->has_plugin('fr.core.dynamicform')){
Plugin::need('dynamicform/DynamicForm');
Dynamicform::remove('fiche-example',array(
'scope'=>'contact',
'uid'=>$_['id']
));
}
});
//ContactExample : Gestion upload Cv
Action::register('example_contact_cv',function(&$response){
File::handle_component(array(
'namespace' => 'example', //stockés dans file/example/*.*
'access' => 'example', // crud sur example,
'size' => '1000000000', // taille max
'storage' => 'example/contact/{{data.id}}/cv/*' //chemin complet vers le fichier stocké
),$response);
});//ContactExample : Gestion upload Avatar
Action::register('example_contact_avatar',function(&$response){
File::handle_component(array(
'namespace' => 'example', //stockés dans file/example/*.*
'access' => 'example', // crud sur example,
'size' => '1000000000', // taille max
'limit' => '1', // nb max de fichiers
'storage' => 'example/contact/{{data.id}}/avatar.*' //chemin complet vers le fichier stocké
),$response);
});
/** QUICKFORM **/
//Création rapide par quickform
Action::register('contact_quick_create',function(&$response){
global $myUser,$_;
User::check_access('example','edit');
require_once(__DIR__.SLASH.'ContactExample.class.php');
ob_start();
require_once(__DIR__.SLASH.'page.quick.example.php');
$response['content'] = ob_get_clean();
});
/** CARD **/
//Récupération card d'un contact
Action::register('example_contact_card',function(&$response){
global $myUser,$myFirm,$_;
User::check_access('example','read');
require_once(__DIR__.SLASH.'ContactExample.class.php');
$contact = ContactExample::provide();
ob_start();
require_once(__DIR__.SLASH.'card.example.contact.php');
$stream = ob_get_clean();
$response['content'] = $stream;
});
Action::register('example_widget_load',function(&$response){
Plugin::need('dashboard/DashboardWidget');
User::check_access('example','read');
$widget = DashboardWidget::current();
$widget->title = 'Widget Example';
ob_start();
//Décommenter après avoir créé widget.php
//require_once(__DIR__.SLASH.'widget.php');
//$widget->content = ob_get_clean();
$widget->content = 'Widget non développé';
echo json_encode($widget);
});
//Sauvegarde des configurations de Example
Action::register('example_setting_save',function(&$response){
global $_,$conf;
User::check_access('example','configure');
//Si input file "multiple", possibilité de normaliser le
//tableau $_FILES récupéré avec la fonction => normalize_php_files();
foreach(Configuration::setting('example') as $key=>$value){
if(!is_array($value)) continue;
$allowed[] = $key;
}
foreach ($_['fields'] as $key => $value) {
if(in_array($key, $allowed))
$conf->put($key,$value);
}
});
?>