Skip to content
This repository
Browse code

Merge branch 'master' of github.com:sofadesign/limonade

  • Loading branch information...
commit d0d5b9c2b3d7ca3d85e33ab0ee14b087dee72eb7 2 parents c36b8df + 2f393bb
Fabrice Luraine authored December 05, 2012
290  LISEZMOI.mkd
Source Rendered
... ...
@@ -1,7 +1,8 @@
1 1
 # Limonade: LISEZMOI
2 2
 
3  
-**ATTENTION: cette documentation n'est pas à jour. Par manque d'aide et de temps, j'ai décidé de ne plus la maintenir. Aussi veuillez vous référer au fichier README.mkd en anglais. Si souhaitez faire revivre la documentation de Limonade dans la langue de Molière, votre contribution est bien entendu la bienvenue. En vous remerciant pour votre compréhension.**  
4  
-**— Fabrice Luraine.**
  3
+> **Cette documentation a été mise à jour en janvier 2012 par [Thomas Ingles](https://github.com/sudwebdesign) mais n'est pas maintenue officiellement.** 
  4
+> **La documentation de référence à consulter reste [README](https://github.com/sofadesign/limonade/blob/master/README.mkd)**
  5
+
5 6
 
6 7
 Limonade est un micro framework PHP qui permet le prototypage et le développement rapide d'applications web.
7 8
 
@@ -29,9 +30,18 @@ la [documentation de l'API publique ](http://limonade.sofa-design.net/api/),les
29 30
 
30 31
 Un [groupe de discussion](http://groups.google.fr/group/limonade) est également à disposition pour plus d'échanges.
31 32
 
32  
-    
  33
+## Requirements ##
  34
+
  35
+* PHP 5.1.6 > (successfully tested with PHP 5.1.6 but it might work with older versions)
  36
+   
33 37
 ## Routes ##
34 38
 
  39
+Routes combine 
  40
+
  41
+* Une méthode HTTP
  42
+* Avec un format d'URL correspondant
  43
+* Et un paramètre de rappel
  44
+
35 45
 Dans Limonade, les routes associent une méthode HTTP et un masque de recherche d'URL à une fonction.
36 46
 
37 47
     dispatch('/', 'my_get_function');
@@ -39,6 +49,7 @@ Dans Limonade, les routes associent une méthode HTTP et un masque de recherche
39 49
         function my_get_function()
40 50
         {
41 51
             // Show something
  52
+            // with the code of this callback controller
42 53
         }
43 54
     
44 55
     dispatch_post('/', 'my_post_function'); 
@@ -130,7 +141,52 @@ On peut également nommer les paramètres joker et les captures d'expression ré
130 141
             $what = params('what');
131 142
             $name = params('name');
132 143
         }
133  
-    
  144
+
  145
+Vous pouvez également fournir les valeurs des paramètres par défaut qui sont fusionnées avec et surchargée par les paramètres du motif.
  146
+
  147
+    $options = array('params' => array('firstname'=>'bob'));
  148
+    dispatch('/hello/:name', 'hello', $options);
  149
+        function hello($firstname, $name) # default parameters first
  150
+        {
  151
+            return 'Hello $firstname $name';
  152
+        }
  153
+
  154
+
  155
+### Callback controllers ###
  156
+
  157
+Le rappel peut être une fonction, une méthode d'objet, une méthode statique ou une fermeture.
  158
+Voir [php documentation](http://php.net/manual/en/language.pseudo-types.php#language.types.callback) to learn more about the callback pseudo-type.
  159
+
  160
+    # will call my_hello_function() function
  161
+    dispatch('/hello', 'my_hello_function');
  162
+
  163
+    # Static class method call, MyClass::hello();
  164
+    dispatch('/hello', array('MyClass', 'hello'));
  165
+
  166
+    # Object method call, $obj->hello();
  167
+    dispatch('/hello', array($obj, 'hello'));
  168
+
  169
+    # Static class method call (As of PHP 5.2.3), MyClass::hello();
  170
+    dispatch('/hello', 'MyClass::hello');
  171
+
  172
+    # Using lambda function (As of PHP 5.3.0)
  173
+    dispatch('/hello', function(){
  174
+      return 'Hello World!';
  175
+    });
  176
+
  177
+Contrôleurs de rappel retourne le résultat vue rendue (voir _Views et templates_).
  178
+
  179
+Ils peuvent prendre les paramètres pattern comme arguments
  180
+
  181
+    dispatch('/hello/:firstname/:name', 'hello');
  182
+        function hello($firstname, $name)
  183
+        {
  184
+            # $firstname parameter equals params('firstname');
  185
+            # and $name parameter equals params('name');
  186
+            return 'Hello $firstname $name';
  187
+        }
  188
+  
  189
+
134 190
 Les fonctions appelées par les routes peuvent être écrites n'importe où avant l'éxécution de la fonction `run()`. Elles peuvent également être regroupées dans des fichiers controlleurs rangés dans un dossier `controllers/`.
135 191
 
136 192
     /                   # site root
@@ -140,9 +196,25 @@ Les fonctions appelées par les routes peuvent être écrites n'importe où avan
140 196
                         #  blog_post()...
141 197
          - comments.php # comments_for_a_post(), comment_add()...
142 198
 
  199
+
  200
+
143 201
 L'emplacement de ce dossier est modifiable grâce à l'option `controllers_dir`
144 202
 
145 203
     option('controllers_dir', dirname(__FILE__).'/other/dir/for/controllers');
  204
+    
  205
+
  206
+Vous pouvez également définir `autoload_controller` fonction de chargement de vos contrôleurs:
  207
+    function autoload_controller($callback) 
  208
+    { 
  209
+       # If $callback, the callback function defined in matching route, 
  210
+       # begins with 'admin_', then we load controllers from
  211
+       # the admin sub-directory in the controllers directory.
  212
+       # Else we load controllers the normal way from 'controllers_dir'.
  213
+       
  214
+       $path = option('controllers_dir'); 
  215
+       if(strpos($callback, "admin_") === 0) $path = file_path($path, 'admin'); 
  216
+       require_once_dir($path); 
  217
+    }
146 218
 
147 219
 ### Url rewriting ###
148 220
 
@@ -154,14 +226,24 @@ Avec un fichier `.htaccess` dans le dossier racine de votre application:
154 226
       Options +FollowSymlinks
155 227
       Options +Indexes
156 228
       RewriteEngine on
157  
-      # RewriteBase /my_app/ # Si votre application est dans un sous-dossier
  229
+      # Si votre application est dans un sous-dossier
  230
+      RewriteBase /my_app/ 
158 231
 
159 232
       # test string is a valid files
160 233
       RewriteCond %{SCRIPT_FILENAME} !-f
161 234
       # test string is a valid directory
162 235
       RewriteCond %{SCRIPT_FILENAME} !-d
163 236
 
164  
-      RewriteRule ^(.*)$   index.php?/$1    [NC,L]
  237
+	#OLD
  238
+#   #RewriteRule ^(.*)$   index.php?/$1    [NC,L]
  239
+
  240
+      RewriteRule ^(.*)$   index.php?uri=/$1    [NC,L,QSA]
  241
+      # with QSA flag (query string append),
  242
+      # forces the rewrite engine to append a query string part of the
  243
+      # substitution string to the existing string, instead of replacing it.
  244
+#Avec drapeau QSA (la chaîne de requête annexé),
  245
+#forces le moteur de réécriture d'annexer une partie de la chaîne de requête de
  246
+#substitution à la chaîne existante, au lieu de le remplacer.
165 247
     </IfModule>
166 248
 
167 249
 Et en renseignant explicitement `option('base_uri')` dans votre fonction configure():
@@ -195,16 +277,15 @@ La méthode `set_or_default` permet de passer une variable, et si elle est vide,
195 277
         {
196 278
             # matching /hello/
197 279
             set_or_default('name', params('name'),'John');
198  
-            return render('Hello %s!'); // returns 'Hello John!' because params('name') was empty. Else it would have return params('name') value.
  280
+            return render('Hello %s!'); // returns 'Hello John!' because params('name') was empty. Else it would have returned params('name') value.
199 281
         }
200 282
     
201  
-    
202  
-    
  283
+Comme vous pouvez le remarquer, la sortie finale est retourné par votre contrôleur. Alors n'oubliez pas de retourner votre vue explicitement dans votre contrôleur avec le mot-clé `return`! * (Cette remarque sera particulièrement utile pour rubyistes;-)) *    
  284
+
203 285
     
204 286
 
205 287
 ### Layouts ###
206 288
 
207  
-
208 289
 Les templates peuvent être rendus à l'intérieur d'un autre template appelé layout.
209 290
 
210 291
 Ce layout est spécifié par la fonction `layout`
@@ -224,16 +305,15 @@ Si la valeur du layout est `null`, le template sera rendu sans layout
224 305
 Les chaînes formatées à la manière de [`sprintf`](http://php.net/manual/function.sprintf.php) sont autorisées:
225 306
 
226 307
     set('num', 5);
227  
-    set('tree');
228  
-    render('There are %d monkeys in the %s') // returns 'There are 5 monkeys in the tree'
229  
-    
230  
-Il est également possible de faire appel à une fonction pour template. On peut ainsi inclure les templates dans un même fichier afin de produire, par exemple, une application dans un fichier unique.
  308
+    set('where', 'tree');
  309
+    return render('There are %d monkeys in the %s') // returns 'There are 5 monkeys in the tree'
231 310
 
  311
+Il est également possible de faire appel à une fonction pour template. On peut ainsi inclure les templates dans un même fichier afin de produire, par exemple, une application dans un fichier unique.
232 312
 
233 313
     function html_message($vars){ extract($vars);?>
234  
-        <h1>Title: <?=h($title)?></h1>
  314
+        <h1>Title: <?php echo h($title); ?></h1>
235 315
         <p>Message:<br>
236  
-           <?=h($msg)?></p>
  316
+           <?php echo h($msg); ?></p>
237 317
     <?}
238 318
     
239 319
     // in a request handling function
@@ -247,7 +327,6 @@ La fonction `html` permet de rendre un template de la même manière que `render
247 327
 
248 328
     html('my_template.html.php');
249 329
 
250  
-
251 330
 ### Templates XML ###
252 331
 
253 332
 La fonction `xml` permet de rendre un template de la même manière que `render`. Une en-tête HTTP précise le `Content-type` adéquat (`text/xml`) et l'encodage défini dans les options (utf8 par défaut).
@@ -286,12 +365,73 @@ Une en-tête HTTP précise le `Content-type` adéquat en fonction de l'extension
286 365
 
287 366
 La sortie est temporisée afin de prendre en charge aisément des fichiers de grande taille.
288 367
 
289  
-### Captures ###
  368
+### Partials ###
290 369
 
291  
-[TODO] `content_for($name); endcontent();`
  370
+La fonction `partielle` est un raccourci pour rendre sans mise en page. Utiles pour la gestion des blocs réutilisables et de les garder dans des fichiers séparés.
  371
+
  372
+Ce code
  373
+
  374
+    partial('my_posts.php', array('posts'=>$posts));
  375
+    
  376
+est le même que
292 377
 
  378
+    render('my_posts.php', null, array('posts'=>$posts));
  379
+
  380
+### Captures ###
  381
+[TODO] `content_for($name); endcontent();`
  382
+La fonction `content_for` vous permet de capturer un bloc de texte dans une vue. Puis le bloc capturé sera disponible pour la mise en page. Ceci est utile pour la gestion des zones de présentation comme une barre latérale ou de définir des fichiers JavaScript ou feuille de style qui sont spécifiques à une vue.
293 383
 ## Avant et après la requête ##
294 384
 
  385
+For example with this layout:
  386
+
  387
+    <div id="content">
  388
+      <div id="main">
  389
+        <?php echo $content; ?>
  390
+      </div>
  391
+      <div id="side">
  392
+        <?php if (isset($side)) echo $side; ?>
  393
+      </div>
  394
+    </div>
  395
+    
  396
+And in your view:
  397
+
  398
+    <p>My main content</p>
  399
+    
  400
+    <?php content_for('side'); ?>
  401
+    <ul>
  402
+      <li><a href="<?php echo url_for('/pages/item1')?>">Item 1</a></li>
  403
+      <li><a href="<?php echo url_for('/pages/item2')?>">Item 2</a></li>
  404
+    </ul>
  405
+    <?php end_content_for(); ?>
  406
+
  407
+Rendered result is:
  408
+
  409
+    <div id="content">
  410
+      <div id="main">
  411
+        <p>My main content</p>
  412
+      </div>
  413
+      <div id="side">
  414
+        <ul>
  415
+          <li><a href="?/pages/item1">Item 1</a></li>
  416
+          <li><a href="?/pages/item1">Item 2</a></li>
  417
+        </ul>
  418
+      </div>
  419
+    </div>
  420
+
  421
+
  422
+L'exemple ci-dessus est détaillé dans [ce tutoriel] (http://blog.limonade-php.net/post/438674987/how-to-use-content-for-and-partial).
  423
+
  424
+Utilisez capture avec les partiels, il va vous aider à organiser vos idées et vous éviter d'avoir à copier / coller le même code plusieurs fois.
  425
+
  426
+## Hooks and filters ##
  427
+
  428
+Limonade permet à l'utilisateur de définir certaines fonctions afin d'améliorer le comportement de Limonade avec ses propres besoins.
  429
+
  430
+Certains comme le hook `before` et le filtre `after` sont couramment utilisés, d'autres sont uniquement pour une utilisation avancée qui nécessite une bonne compréhension du fonctionnement interne de Limonade.
  431
+
  432
+
  433
+### Before ###
  434
+
295 435
 Vous pouvez définir une fonction `before` qui sera executée avant chaque requête. Cela s'avère très utile pour définir un layout par défaut ou des variables à passer aux templates
296 436
 
297 437
     function before($route)
@@ -300,17 +440,109 @@ Vous pouvez définir une fonction `before` qui sera executée avant chaque requ
300 440
         set('site_title', 'My Website');
301 441
     }
302 442
 
  443
+
  444
+La route courrante trouvé est également passé avant la fonction, vous pouvez donc tester. C'est un tableau retourné par la fonction interne `route_find`, avec ces valeurs:
  445
+
  446
+* `method` (HTTP method)
  447
+* `pattern` (regexp pattern)
  448
+* `names` (params names)
  449
+* `callback` (callback)
  450
+* `options` (route options)
  451
+* `params` (current params)
  452
+
  453
+### After ###
  454
+
303 455
 Un filtre de sortie `after` est également disponible. Il est exécuté après chaque requête et permet d'appliquer une transformation à la sortie (sauf pour les sorties `render_file` qui sont envoyées directement au tampon de sortie).
304 456
 
305  
-    function after($output, $route){
306  
-        $config = array('indent' => TRUE,
307  
-    	                'output-xhtml' => TRUE,
308  
-    	                'wrap' => 200);
  457
+    function after($output){
  458
+      $config = array('indent' => TRUE,
  459
+                      'output-xhtml' => TRUE,
  460
+                      'wrap' => 200);
  461
+      
  462
+      $encoding = strtoupper(str_replace('-','', option('encoding')));
  463
+      $tidy = tidy_parse_string($output, $config, $encoding);
  464
+      $tidy->cleanRepair();
  465
+      return $tidy;
  466
+    }
  467
+    
  468
+The current executed route is also available for `after` function.
  469
+
  470
+### Before render ###
  471
+
  472
+Vous pouvez définir une fonction `before_render` qui filtrera votre vue avant de l'afficher.
  473
+
  474
+Les trois premiers paramètres sont les mêmes que ceux passés à la fonction `render` :
  475
+
  476
+* `$content_or_func`: the view string
  477
+* `$layout`: tracé du chemin actuel (current layout path)
  478
+* `$locals`: variables passés directement à la function `render`
  479
+
  480
+Last parameter, `$view_path` is by default `file_path(option('views_dir'), $content_or_func);`
309 481
 
310  
-    	$tidy = tidy_parse_string($output, $config, option('encoding'));
311  
-    	return $tidy->cleanRepair();
  482
+    function before_render($content_or_func, $layout, $locals, $view_path)
  483
+    {
  484
+      # Transform $content_or_func, $layout, $locals or $view_path.
  485
+      # Then return there new values
  486
+      return array($content_or_func, $layout, $locals, $view_path);
312 487
     }
313 488
 
  489
+### Autorender ###
  490
+
  491
+Vous pouvez définir vos propres fonctions `autorender` pour effectuer automatiquement le rendu selon l' actuel itinéraire correspondant. Il sera exécuté si votre contrôleur renvoie une sortie nulle.
  492
+
  493
+    dispatch('/', 'hello');
  494
+    function hello()
  495
+    {
  496
+        # process some stuff...
  497
+        set('name', 'Bob');
  498
+        
  499
+        # but don't return anything
  500
+        # ( like if you were ending this function with return null; )
  501
+    }
  502
+    
  503
+    function autorender($route)
  504
+    {
  505
+        $view = $route['callback'] . ".html.php";
  506
+        return html($view);
  507
+    }
  508
+    
  509
+Dans cet exemple, lorsque est appelé l'url `/`, `hello()` est exécuté, puis `autorender()` donne la view correspondante `hello.html.php`.
  510
+
  511
+### Before exit ###
  512
+
  513
+Si vous définissez un `before_exit`, il est appelé au début du processus d'arrêt / sortie (la fonction `stop_and_exit` est appelée automatiquement lors de la fin de l'application Limonade).
  514
+
  515
+    function before_exit($exit)
  516
+    {
  517
+        # $exit is the same parameter as the one passed to `stop_and_exit`.
  518
+        # If it's false, the exit process will not be executed, 
  519
+        # only the stop instructions
  520
+        # by default it is true
  521
+    }
  522
+
  523
+### Before sending a header ###
  524
+
  525
+Vous pouvez définir une fonction `before_sending_header` fonction qui sera appelée avant que Limonade émete un appel à header(). De cette façon, vous pouvez ajouter en-têtes supplémentaires:
  526
+
  527
+    dispatch('/style.css', 'css');
  528
+    function css()
  529
+    {
  530
+        # Generate css file and output
  531
+        return css('style.css.php');
  532
+    }
  533
+
  534
+    function before_sending_header($header)
  535
+    {
  536
+        if (strpos($header, 'text/css') !== false)
  537
+        {
  538
+            # intercept text/css content-type and add caching to the headers
  539
+            send_header("Cache-Control: max-age=600, public");
  540
+        }
  541
+    }
  542
+
  543
+__Attention__: Prenez soin de ne pas provoquer une boucle en appelant à plusieurs reprises `send_header()` venant de la fonction `before_sending_header()`!
  544
+
  545
+
314 546
 ## Configuration ##
315 547
 
316 548
 Vous pouvez définir une fonction `configure` qui sera exécutée au début de l'application (au début de l'exécution de `run()`).
@@ -390,6 +622,11 @@ Consultez le code source et l'API pour de plus amples informations sur les helpe
390 622
 
391 623
 Utilisez la fonction `url_for` afin de créer automatiquement des urls bien formées quel que soit le dossier dans lequel est installée votre application sur le serveur web.
392 624
 
  625
+    # with option('base_uri', '?')
  626
+    url_for('one', 'two', 'three'); # returns ?/one/two/three
  627
+    url_for('one', 'two', array('page' => 1)); # returns ?/one/two&amp;page=2
  628
+    
  629
+
393 630
 Si vous utilisez l'url rewriting, vous devez spécifier explicitement l'option `base_uri` (par défaut `/chemin_de_mon_appli/?`).
394 631
 
395 632
 
@@ -477,7 +714,8 @@ La constante `E_LIM_PHP` désigne toutes les erreurs PHP (renvoyé par PHP ou vi
477 714
 
478 715
 ## More ##
479 716
 
480  
-* [Limonade web site](http://limonade.sofa-design.net/)
  717
+* [Limonade web site](http://www.limonade-php.net/)
  718
+* [Limonade blog](http://blog.limonade-php.net/)
481 719
 * [Issue tracking / release planning](http://sofadesign.lighthouseapp.com/projects/29612-limonade/overview)
482 720
 * [Support / Discussions](http://groups.google.fr/group/limonade)
483 721
 
8  README.mkd
Source Rendered
@@ -22,7 +22,7 @@ Limonade is easy to learn and provides everything that you can expect from a mod
22 22
 
23 23
 This document provides a quick, but comprehensive, guide of Limonade features.
24 24
 
25  
-For more informations, you can see the [website](http://www.limonade-php.net/), [examples](http://www.limonade-php.net/examples.htm), and of course the [source code](http://github.com/sofadesign/limonade/blob/master/lib/limonade.php) which is still the best documentation.
  25
+For more informations, you can see the [website](http://limonade-php.github.com/), [examples](https://github.com/sofadesign/limonade/wiki/Examples-and-tutorials), and of course the [source code](http://github.com/sofadesign/limonade/blob/master/lib/limonade.php) which is still the best documentation.
26 26
 
27 27
 A [discussion group](http://groups.google.fr/group/limonade) is also available for more exchanges.
28 28
 
@@ -570,7 +570,7 @@ You can define options inside it, a connection to a database ...
570 570
         $GLOBALS['my_db_connexion'] = new PDO(option('dsn'));
571 571
     }
572 572
 
573  
-PHP files contained in the `option('lib_dir')` folder (`lib/` by default) are loaded with [`require_once`](http://php.net/manual/function.require-once.php) just before executing `configure`. So you can place in this folder all your PHP libraries and functions so that they will be loaded and available at application launch.
  573
+PHP files contained in the `option('lib_dir')` folder (`lib/` by default) are loaded with [`require_once`](http://php.net/manual/function.require-once.php) just after executing `configure`. So you can place in this folder all your PHP libraries and functions so that they will be loaded and available at application launch.
574 574
 
575 575
 ## Options ##
576 576
 
@@ -724,8 +724,8 @@ Limonade also provides a useful set of functions that can help you managing file
724 724
 
725 725
 ## More ##
726 726
 
727  
-* [Limonade web site](http://www.limonade-php.net/)
728  
-* [Limonade blog](http://blog.limonade-php.net/)
  727
+* [Limonade web site](http://limonade-php.github.com/)
  728
+* [Limonade blog](http://limonade.tumblr.com/)
729 729
 * [Issue tracking / release planning](http://sofadesign.lighthouseapp.com/projects/29612-limonade/overview)
730 730
 * [Support / Discussions](http://groups.google.fr/group/limonade)
731 731
 
12  lib/limonade.php
@@ -7,7 +7,7 @@
7 7
  * 
8 8
  *  a PHP micro framework.
9 9
  * 
10  
- *  For more informations: {@link http://github/sofadesign/limonade}
  10
+ *  For more informations: {@link https://github.com/sofadesign/limonade}
11 11
  *  
12 12
  *  @author Fabrice Luraine
13 13
  *  @copyright Copyright (c) 2009 Fabrice Luraine
@@ -1044,7 +1044,7 @@ function request_uri($env = null)
1044 1044
       $uri = $path_info;
1045 1045
     }
1046 1046
     // No PATH_INFO?... What about QUERY_STRING?
1047  
-    elseif (trim($query_string, '/') != '')
  1047
+    elseif (trim($query_string, '/') != '' && $query_string[0] == '/')
1048 1048
     {
1049 1049
       $uri = $query_string;
1050 1050
       $get = $env['GET'];
@@ -1058,11 +1058,17 @@ function request_uri($env = null)
1058 1058
     }
1059 1059
     elseif(array_key_exists('REQUEST_URI', $env['SERVER']) && !empty($env['SERVER']['REQUEST_URI']))
1060 1060
     {
1061  
-      $request_uri = rtrim(rawurldecode($env['SERVER']['REQUEST_URI']), '?/').'/';
  1061
+      $request_uri = rtrim($env['SERVER']['REQUEST_URI'], '?/').'/';
1062 1062
       $base_path = $env['SERVER']['SCRIPT_NAME'];
1063 1063
 
1064 1064
       if($request_uri."index.php" == $base_path) $request_uri .= "index.php";
1065 1065
       $uri = str_replace($base_path, '', $request_uri);
  1066
+      if(option('base_uri') && strpos($uri, option('base_uri')) === 0) {
  1067
+       $uri = substr($uri, strlen(option('base_uri')));
  1068
+      }
  1069
+      if(strpos($uri, '?') !== false) {
  1070
+      	$uri = substr($uri, 0, strpos($uri, '?')) . '/';
  1071
+      }
1066 1072
     }
1067 1073
     elseif($env['SERVER']['argc'] > 1 && trim($env['SERVER']['argv'][1], '/') != '')
1068 1074
     {
2  lib/limonade/tests.php
@@ -334,7 +334,7 @@ function test_request($url, $method="GET", $include_header=false, $post_data=arr
334 334
     curl_setopt($curl, CURLOPT_HTTPHEADER, $http_header);
335 335
     curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
336 336
     curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); 
337  
-    if($method == 'POST')
  337
+    if($method == 'POST' || $method == 'PUT')
338 338
     {
339 339
       curl_setopt($curl, CURLOPT_POST, 1);
340 340
       curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);

0 notes on commit d0d5b9c

Please sign in to comment.
Something went wrong with that request. Please try again.