diff --git a/FEATURES/132136 b/FEATURES/132136
new file mode 100644
index 0000000000000000000000000000000000000000..2dcff8ef88fd817500e282bfacac0bcb60b4f315
--- /dev/null
+++ b/FEATURES/132136
@@ -0,0 +1,10 @@
+        '132136' =>
+            ['Label' => $this->_('Modèles d\'impression : export PDF'),
+             'Desc' => $this->_('Adaptation de l\'éditeur de modèles d\'impression pour éditer des modèles avancés'),
+             'Image' => '',
+             'Video' => '',
+             'Category' => '',
+             'Right' => function($feature_description, $user) {return true;},
+             'Wiki' => 'https://wiki.bokeh-library-portal.org/index.php?title=Cat%C3%A9gorie:Mod%C3%A8les_d%27impressions',
+             'Test' => '',
+             'Date' => '2022-09-16'],
\ No newline at end of file
diff --git a/VERSIONS_WIP/132136 b/VERSIONS_WIP/132136
new file mode 100644
index 0000000000000000000000000000000000000000..e91fca499fc8ccdf27b10b8c19c3af2d41a5ffed
--- /dev/null
+++ b/VERSIONS_WIP/132136
@@ -0,0 +1 @@
+ - fonctionnalité #132136 : Editeur de modèle d'impressions : utilisation de CodeMirror, plus adapté que l'éditeur CKEditor
\ No newline at end of file
diff --git a/application/modules/admin/controllers/PrintController.php b/application/modules/admin/controllers/PrintController.php
index a0bd2cedcacf856f231933b42b995a0902fe7b71..9860de03a76989d571dcccbacc3f61fb1c8a7913 100644
--- a/application/modules/admin/controllers/PrintController.php
+++ b/application/modules/admin/controllers/PrintController.php
@@ -22,8 +22,8 @@
 
 class Admin_PrintController extends ZendAfi_Controller_Action {
   public function getPlugins() {
-    return ['ZendAfi_Controller_Plugin_ResourceDefinition_ModeleFusion',
-            'ZendAfi_Controller_Plugin_Manager_ModeleFusion'];
+    return [ZendAfi_Controller_Plugin_ResourceDefinition_ModeleFusion::class,
+            ZendAfi_Controller_Plugin_Manager_ModeleFusion::class];
   }
 
 
@@ -31,4 +31,4 @@ class Admin_PrintController extends ZendAfi_Controller_Action {
     $this->view->titre=$this->view->_('Modèles d\'impressions');
     $this->view->models= Class_ModeleFusion::getTemplates();
   }
-}
\ No newline at end of file
+}
diff --git a/library/ZendAfi/Controller/Plugin/Manager/ModeleFusion.php b/library/ZendAfi/Controller/Plugin/Manager/ModeleFusion.php
index e37d6a3eb64f26f4974d25cf54d5cda71b18f5dd..eda6588bd95c69986874f535becd8978a0feceab 100644
--- a/library/ZendAfi/Controller/Plugin/Manager/ModeleFusion.php
+++ b/library/ZendAfi/Controller/Plugin/Manager/ModeleFusion.php
@@ -38,5 +38,24 @@ class ZendAfi_Controller_Plugin_Manager_ModeleFusion extends ZendAfi_Controller_
     Class_ModeleFusion::generateDefaults($this->_view);
     $this->_redirectToReferer();
   }
+
+
+  protected function _postEditAction($model) {
+    Class_ScriptLoader::getInstance()
+      ->loadCodeMirror()
+      ->addAdminScript('codemirror-4.4/mode/css/css')
+      ->addAdminScript('codemirror-4.4/mode/xml/xml')
+      ->addAdminScript('codemirror-4.4/mode/htmlmixed/htmlmixed')
+      ->addInlineStyle('.CodeMirror-wrap { height: 500px }')
+      ->addJQueryReady("
+         CodeMirror.fromTextArea($('textarea[name=\'contenu\']')[0],
+              {
+                lineNumbers:true,
+                tabSize:2,
+                matchBrackets:true,
+                lineWrapping:true,
+                mode: 'htmlmixed'
+              });");
+  }
 }
-?>
\ No newline at end of file
+?>
diff --git a/library/ZendAfi/Controller/Plugin/ResourceDefinition/ModeleFusion.php b/library/ZendAfi/Controller/Plugin/ResourceDefinition/ModeleFusion.php
index 3455f0763daa497cb6abd26e0e63369392709d06..abd664d2ebf3e5f112e470e5a701398e7eea9ff3 100644
--- a/library/ZendAfi/Controller/Plugin/ResourceDefinition/ModeleFusion.php
+++ b/library/ZendAfi/Controller/Plugin/ResourceDefinition/ModeleFusion.php
@@ -23,7 +23,7 @@
 class ZendAfi_Controller_Plugin_ResourceDefinition_ModeleFusion extends ZendAfi_Controller_Plugin_ResourceDefinition_Abstract {
 
   public function getDefinitions() {
-    return ['model' => ['class' => 'Class_ModeleFusion',
+    return ['model' => ['class' => Class_ModeleFusion::class,
                         'name' => 'modele_fusion',
                         'order' => 'id'],
 
@@ -34,10 +34,10 @@ class ZendAfi_Controller_Plugin_ResourceDefinition_ModeleFusion extends ZendAfi_
             'actions' => ['edit' => ['title' => $this->_('Modifier le modèle d\'impression "%s"')],
                           'add' => ['title' => $this->_('Créer un nouveau modèle d\'impression')]],
 
-            'form_class_name' => 'ZendAfi_Form_ModeleFusion',
+            'form_class_name' => ZendAfi_Form_ModeleFusion::class,
 
             'after_delete' => function() { $this->_redirect('/admin/print/index');}
     ];
   }
 }
-?>
\ No newline at end of file
+?>
diff --git a/library/ZendAfi/Form/ModeleFusion.php b/library/ZendAfi/Form/ModeleFusion.php
index 89b5e7800ebbdf8934f77a3147ffe5b9f7823f09..46ccb968bb61d1a4c2c146370480c7d28fba2b17 100644
--- a/library/ZendAfi/Form/ModeleFusion.php
+++ b/library/ZendAfi/Form/ModeleFusion.php
@@ -44,7 +44,7 @@ class ZendAfi_Form_ModeleFusion extends ZendAfi_Form {
                       'profil_ids',
                       ['label' => $form->_('Afficher pour les profils (separé par des ;)'),
                       ])
-         ->addElement('ckeditor',
+         ->addElement('textarea',
                       'contenu',
                       [
                        'label' => '',
@@ -65,4 +65,4 @@ class ZendAfi_Form_ModeleFusion extends ZendAfi_Form {
   }
 
 }
-?>
\ No newline at end of file
+?>
diff --git a/public/admin/skins/bokeh74/global.css b/public/admin/skins/bokeh74/global.css
index 9531d3fea6827570a755bf9ddefa96b4b8900af5..5f131b7499e4b4166607c677983b9c08e3b43cee 100755
--- a/public/admin/skins/bokeh74/global.css
+++ b/public/admin/skins/bokeh74/global.css
@@ -1207,3 +1207,8 @@ img.cke_slideShow {
     height: 100px;
     margin: 5px;
 }
+
+
+.CodeMirror pre {
+    box-shadow: none;
+}
diff --git a/tests/application/modules/admin/controllers/PrintControllerTest.php b/tests/application/modules/admin/controllers/PrintControllerTest.php
index e11c5a8898132a14aa88b9fb901fe3ac4eb54862..6773ea9f4ab56abb8bdedd8dc32b27fb9f1e032a 100644
--- a/tests/application/modules/admin/controllers/PrintControllerTest.php
+++ b/tests/application/modules/admin/controllers/PrintControllerTest.php
@@ -21,11 +21,9 @@
 
 
 class PrintControllerIndexTest extends Admin_AbstractControllerTestCase {
-  protected $_storm_default_to_volatile = true;
-
   public function setUp() {
     parent::setUp();
-    $this->fixture('Class_ModeleFusion',
+    $this->fixture(Class_ModeleFusion::class,
                    ['id' => 5,
                     'nom' => 'Search result',
                     'type' => 'Notice_List',
@@ -56,8 +54,6 @@ class PrintControllerIndexTest extends Admin_AbstractControllerTestCase {
 
 
 class PrintControllerGenerateTest extends Admin_AbstractControllerTestCase {
- protected $_storm_default_to_volatile = true;
-
   public function setUp() {
     parent::setUp();
     $this->dispatch('/admin/print/generate', true);
@@ -98,21 +94,21 @@ class PrintControllerGenerateTest extends Admin_AbstractControllerTestCase {
 
 
 class PrintControllerIndexActionTest extends AbstractControllerTestCase {
-  protected $_storm_default_to_volatile = true;
   public function setUp() {
     parent::setUp();
-    $modele_lettre_stagiaires = $this->fixture('Class_ModeleFusion',
-                                               ['id' => 19,
-                                                'nom' =>'ACTIVITY_LISTE_STAGIAIRES',
-                                                'contenu' => '<h1>Liste des stagiaires pour la session du {session_activity.date_debut_texte} au {session_activity.date_fin_texte}</h1>
+    $this->fixture(Class_ModeleFusion::class,
+                   ['id' => 19,
+                    'nom' =>'ACTIVITY_LISTE_STAGIAIRES',
+                    'contenu' => '<h1>Liste des stagiaires pour la session du {session_activity.date_debut_texte} au {session_activity.date_fin_texte}</h1>
                     <h2>{session_activity.activity.libelle}</h2>
                     {session_activity.stagiaires["Nom":nom, "Prénom":prenom, "Bibliothèque":bib.libelle, "Téléphone":telephone]}']);
 
-    $this->fixture('Class_ModeleFusion', ['id' => 1,
-                                          'nom' => 'Template recherche',
-                                          'contenu' => '<p> {notices.each[<img src="{url_vignette}"/>  {titre_principal} <div>{article.contenu}</div>
+    $this->fixture(Class_ModeleFusion::class,
+                   ['id' => 1,
+                    'nom' => 'Template recherche',
+                    'contenu' => '<p> {notices.each[<img src="{url_vignette}"/>  {titre_principal} <div>{article.contenu}</div>
 ]}</p>',
-                                          'type' => 'Notice_List']);
+                    'type' => 'Notice_List']);
 
     $this->dispatch('/admin/print/index',true);
   }
@@ -134,8 +130,6 @@ class PrintControllerIndexActionTest extends AbstractControllerTestCase {
 
 
 class PrintControllerAddActionTest extends AbstractControllerTestCase {
-  protected $_storm_default_to_volatile = true;
-
   public function setUp() {
     parent::setUp();
     $this->dispatch('/admin/print/add',true);
@@ -158,7 +152,6 @@ class PrintControllerAddActionTest extends AbstractControllerTestCase {
 
 
 class PrintControllerPostActionTest extends AbstractControllerTestCase {
-  protected $_storm_default_to_volatile = true;
   public function setUp() {
     parent::setUp();
     $this->postDispatch('/admin/print/add', ['nom' => 'recherche',
@@ -170,6 +163,36 @@ class PrintControllerPostActionTest extends AbstractControllerTestCase {
 
   /** @test */
   public function templateShouldSaveProfils() {
-    $this->assertEquals('5;6',Class_ModeleFusion::find(1)->getProfilIds());
+    $this->assertEquals('5;6', Class_ModeleFusion::find(1)->getProfilIds());
+  }
+}
+
+
+
+
+class PrintControllerAdminEditTest extends AbstractControllerTestCase {
+  public function setUp() {
+    parent::setUp();
+    $this->fixture(Class_ModeleFusion::class,
+                       ['id' => 1,
+                        'nom' => 'Notices',
+                        'contenu' => '<p> {notices.each[<img src="{url_vignette}"/>  {titre_principal} <div>{article.contenu}</div>
+]}</p>',
+                        'type' => 'Notice_List']);
+
+    $this->dispatch('/admin/print/edit/id/1');
+  }
+
+
+  /** @test */
+  public function textAreaShouldContainsContentNoticesEach() {
+    $this->assertXPathContentContains('//textarea[@name="contenu"]',
+                                      'notices.each[');
+  }
+
+
+  /** @test */
+  public function pageShouldLoadCodeMirror() {
+    $this->assertXPathContentContains('//script', 'CodeMirror.fromTextArea($(\'textarea[name=\\\'contenu\\\'');
   }
 }