Compare commits

..
684 Commits
Author SHA1 Message Date
Bachir Soussi Chiadmi ec0aa5b0bc Merge branch 'prod' into solr4 2015-10-21 19:44:25 +02:00
Bachir Soussi Chiadmi 248c5ed3e1 added search form back bouton 2015-10-21 19:43:37 +02:00
Bachir Soussi Chiadmi 7c56b13587 updated search_api modules to last version
i will try to dont patch them anymore
2015-10-21 18:40:10 +02:00
Bachir Soussi Chiadmi ace9de07e2 started base home back btn 2015-10-21 17:44:29 +02:00
Bachir Soussi Chiadmi 7ad1f5dc67 patched i18n modules for node don't record chosen language on create
see https://www.drupal.org/node/1852102#comment-9612303
2015-10-14 17:15:19 +02:00
Bachir Soussi Chiadmi d5628cc78e updated entity_translation to last dev version 2015-10-14 17:09:13 +02:00
Bachir Soussi Chiadmi 81371521c7 updated gitignore to ignore .directory files 2015-10-14 17:03:08 +02:00
Bachir Soussi Chiadmi eb699f528d updated date pathauto addressfield honeypot features modules 2015-10-12 12:03:12 +02:00
Bachir Soussi Chiadmi 0ba0c21bb9 upadated colorbox andd prod_check 2015-10-12 11:52:36 +02:00
Bachir Soussi Chiadmi 50c3e1c7d7 added list of deleted entities from flag list content 2015-09-27 19:50:44 +02:00
Bachir Soussi Chiadmi f0cb6175c1 patched flag list to trigger remove entity from lists when this entity is deleted 2015-09-27 18:55:26 +02:00
Bachir Soussi Chiadmi e004b7a238 patched node-export module
https://www.drupal.org/node/1869918
https://www.drupal.org/node/1911638
2015-09-18 14:54:38 +02:00
Bachir Soussi Chiadmi f7cd9c0858 ran security updates on contrib modules
ctools, video_embed_field, migrate, views_bulk_operations
2015-09-17 14:44:25 +02:00
Bachir Soussi Chiadmi 5d30d9bcee repatched user module
Implement language aware tokens for one time login link and cancel link
https://www.drupal.org/node/1754162
2015-09-17 13:59:26 +02:00
Bachir Soussi Chiadmi c4f2e62697 core update from 7.37 to 7.38 2015-09-17 13:08:35 +02:00
Bachir Soussi Chiadmi a99f2d7aa6 fixed rss media notification
https://www.drupal.org/node/2472409
2015-09-16 16:34:31 +02:00
Bachir Soussi Chiadmi 4e8346e5e3 fixed weight field rights for admin 2015-07-21 18:04:54 +02:00
Bachir Soussi Chiadmi 5b281024a5 added database link on home for members 2015-07-21 15:58:56 +02:00
Bachir Soussi Chiadmi 96903cab02 fixed some header display 2015-07-17 18:18:01 +02:00
Bachir Soussi Chiadmi ce20bb3f0f fixed some header display 2015-07-17 18:05:02 +02:00
Bachir Soussi Chiadmi 19d3d90743 fixed publication node display 2015-07-17 17:56:35 +02:00
Bachir Soussi Chiadmi 62fec82217 fixed printed cards 2015-07-16 17:08:15 +02:00
Bachir Soussi Chiadmi f0295847f9 fixed icon alignement on header's blocks 2015-07-16 16:21:27 +02:00
Bachir Soussi Chiadmi cc657eaec4 added publications links and display of pubications pages 2015-07-16 15:46:48 +02:00
Bachir Soussi Chiadmi 54f496acad added contact footer on home V2 2015-07-16 15:02:15 +02:00
Bachir Soussi Chiadmi feef7951cd removed img max width on simplenews nodes 2015-07-07 22:32:49 +02:00
Bachir Soussi Chiadmi 8def2961ac updated user export materio module 2015-07-07 22:11:34 +02:00
Bachir Soussi Chiadmi 1c38e1b72a added fixed width for simplenews node type 2015-07-07 18:49:42 +02:00
Bachir Soussi Chiadmi 0446c17ad1 added home visibility field to simplenews content type and one more filtre on homeV2 view for news letter 2015-07-03 10:56:26 +02:00
Bachir Soussi Chiadmi 459335fee1 removed front-page module 2015-07-03 10:31:06 +02:00
Bachir Soussi Chiadmi 408251fd28 admin features remoced front-page dependencie 2015-07-03 10:28:35 +02:00
Bachir Soussi Chiadmi 98d1b5cb03 fixed front for member display 2015-07-02 20:14:15 +02:00
Bachir Soussi Chiadmi 141d1f4b5c added front by role 2015-07-02 20:08:33 +02:00
Bachir Soussi Chiadmi 100dce022a some display 2015-07-02 19:38:33 +02:00
Bachir Soussi Chiadmi 3220ed8e4b fixed login redirection from login block and improved design of this block 2015-07-02 19:24:43 +02:00
Bachir Soussi Chiadmi 22146c2778 fixed viewmode change bug 2015-07-02 18:34:27 +02:00
Bachir Soussi Chiadmi f4b8bfa249 removed newsletters which user doesn't have access to 2015-06-26 19:24:47 +02:00
Bachir Soussi Chiadmi 4c32c73321 added user export page for simplenews unsubscription 2015-06-26 18:42:45 +02:00
Bachir Soussi Chiadmi 09d1f06552 fixed some display bug 2015-06-24 17:20:14 +02:00
Bachir Soussi Chiadmi ade4a41f76 fixed user profile form display 2015-06-24 16:29:54 +02:00
Bachir Soussi Chiadmi 19b1d49a22 applied fixe width to all page exept /actuality and /explore 2015-06-24 16:00:38 +02:00
Bachir Soussi Chiadmi 4264a271b4 added simple_pass_reset module 2015-06-24 15:48:23 +02:00
Bachir Soussi Chiadmi de040b46ea re-add linked materials on actuality page for visitors, in big card viewmode 2015-06-23 16:33:05 +02:00
Bachir Soussi Chiadmi aa323869c3 display none links on home regarding logged-in or not 2015-06-18 18:34:20 +02:00
Bachir Soussi Chiadmi 22e93d650e added class field to page links field 2015-06-18 18:26:30 +02:00
Bachir Soussi Chiadmi 2664d2fcfd fixed localisation link display 2015-06-18 18:01:03 +02:00
Bachir Soussi Chiadmi feb93503b6 fixed hash encoding bug with chrome between tarifs page and register form 2015-06-18 17:43:16 +02:00
Bachir Soussi Chiadmi 2d5be00cf1 improved mobile display 2015-06-17 19:25:33 +02:00
Bachir Soussi Chiadmi a84cd67456 improved mobile display 2015-06-17 19:23:41 +02:00
Bachir Soussi Chiadmi 8a1f5cd116 improved mobile display 2015-06-17 19:21:32 +02:00
Bachir Soussi Chiadmi 65c7ab92b6 fixed skrollr for mobile, added skrollrbody option in init 2015-06-17 18:49:11 +02:00
Bachir Soussi Chiadmi 1c1de98039 bug fixe 2015-06-15 20:53:06 +02:00
Bachir Soussi Chiadmi 2e4a069036 fixed some display 2015-06-15 18:15:53 +02:00
Bachir Soussi Chiadmi cc8306bc14 fixed forms display 2015-06-15 17:47:06 +02:00
Bachir Soussi Chiadmi d107702f86 updated pricing page 2015-06-15 17:34:54 +02:00
Bachir Soussi Chiadmi f9144db774 removed linked materials from actuality page 2015-06-15 15:32:05 +02:00
Bachir Soussi Chiadmi 1ca1912fe2 added card behaviour to news on homeV2 2015-06-15 15:13:04 +02:00
Bachir Soussi Chiadmi 1657634e1a fixed the right color background for video home 2015-06-15 14:06:34 +02:00
Bachir Soussi Chiadmi a908bb02ca removed beta 2015-06-15 14:00:44 +02:00
Bachir Soussi Chiadmi 4eadc1b771 removed translation link from publications 2015-06-15 12:21:31 +02:00
Bachir Soussi Chiadmi ce2f811278 added new window option for page link field 2015-06-15 12:08:23 +02:00
Bachir Soussi Chiadmi 1c42c93c54 removed some dsm 2015-06-15 11:51:12 +02:00
Bachir Soussi Chiadmi 71744db508 added rights for simplenews subscriptions by roles 2015-06-15 11:48:45 +02:00
Bachir Soussi Chiadmi 3add8f6b96 added weight field to publications 2015-06-14 19:35:34 +02:00
Bachir Soussi Chiadmi 678343b0e9 home v2 2015-06-10 19:27:56 +02:00
Bachir Soussi Chiadmi 5485f80dae home v2 2015-06-10 19:26:56 +02:00
Bachir Soussi Chiadmi 6df0ebfa53 home v2 2015-06-10 19:25:08 +02:00
Bachir Soussi Chiadmi 9521fc1ce5 home v2 2015-06-10 19:22:26 +02:00
Bachir Soussi Chiadmi 1f1247a226 home v2 2015-06-10 19:21:34 +02:00
Bachir Soussi Chiadmi b05c9a53c5 home v2: upadted features 2015-06-10 19:18:11 +02:00
Bachir Soussi Chiadmi b2d9b7dbf7 home v2: fixed simple news sub display 2015-06-10 19:05:00 +02:00
Bachir Soussi Chiadmi 98bc1dfef8 home v2: fixed simple news sub display 2015-06-10 19:01:12 +02:00
Bachir Soussi Chiadmi d35191a96e home v2: hide simple news from register block 2015-06-10 18:59:23 +02:00
Bachir Soussi Chiadmi 2fd09f23e9 home v2: added register block and newsletter subscription 2015-06-10 18:50:27 +02:00
Bachir Soussi Chiadmi 181a28cd85 fixed link display home v2 2015-06-10 17:47:49 +02:00
Bachir Soussi Chiadmi d5155b3b31 added links to home v2 2015-06-10 17:01:47 +02:00
Bachir Soussi Chiadmi 32f26b4bf5 added links to home v2 2015-06-10 16:57:35 +02:00
Bachir Soussi Chiadmi 1b9752f495 updated admin for publication 2015-06-10 16:17:54 +02:00
Bachir Soussi Chiadmi afd3a90538 upadted home V2 2015-06-10 15:53:49 +02:00
Bachir Soussi Chiadmi 96aef8c128 home v2 fixed menu links display 2015-06-09 18:08:38 +02:00
Bachir Soussi Chiadmi 73741839ca home v2 update 2015-06-09 18:03:11 +02:00
Bachir Soussi Chiadmi 8a8ed4f929 updated publication feature 2015-06-03 20:09:11 +02:00
Bachir Soussi Chiadmi e12a664fa5 added publications and some skrollr animations to home v2 2015-06-03 20:06:35 +02:00
Bachir Soussi Chiadmi 6ceb7d6534 added workflow strongarm variable to admin feature 2015-06-03 17:12:25 +02:00
Bachir Soussi Chiadmi 3ffbc09c10 big update for home v2 2015-06-03 17:02:24 +02:00
Bachir Soussi Chiadmi 49004d7fee repatched views module 2015-05-26 20:01:49 +02:00
Bachir Soussi Chiadmi 706c96d663 updated modules
views friendly_register serial address_field i18n
2015-05-26 19:56:22 +02:00
Bachir Soussi Chiadmi c9f8dc21ed updated loggintobogan 2015-05-26 19:48:46 +02:00
Bachir Soussi Chiadmi 59cec97bcf updated patch lists 2015-05-26 19:45:37 +02:00
Bachir Soussi Chiadmi c2a05d8ab3 repatched user module
Implement language aware tokens for one time login link and cancel link
https://www.drupal.org/node/1754162
2015-05-26 19:34:57 +02:00
Bachir Soussi Chiadmi f75cb5562c updated core to 7.37 2015-05-26 19:28:47 +02:00
Bachir Soussi Chiadmi 342655bf2b updated publication feature 2015-05-26 18:45:25 +02:00
Bachir Soussi Chiadmi f9f0ce54ec Merge branch 'homeV2' of https://bitbucket.org/bachysoucy/materio-base-d7 into homeV2 2015-05-26 18:30:49 +02:00
Bachir Soussi Chiadmi 0c29476b3f updated features for home v2 2015-05-26 18:24:48 +02:00
sarah garcin c183a0b0dd add scrollto function 2015-05-26 18:14:30 +02:00
sarah garcin ea423f2146 add images funky 2015-05-26 16:15:22 +02:00
Bachir Soussi Chiadmi 580c97dc49 fixed frontend search field bad display 2015-05-26 12:39:32 +02:00
sarah garcin 95cbb13821 theming new materio Home css 2015-05-20 17:08:18 +02:00
Bachir Soussi Chiadmi ddae683ff3 removed pays filtre from admin view company 2015-05-19 19:52:31 +02:00
Bachir Soussi Chiadmi c90787212b materiau print page css 2015-05-19 19:14:40 +02:00
Bachir Soussi Chiadmi 81ea02bb3e Merge branch 'homeV2' into prod 2015-05-19 15:03:05 +02:00
Bachir Soussi Chiadmi d9f6370962 admin feature
added admin the right to add premium role
2015-05-19 14:11:04 +02:00
sarah garcin 40e4643644 start theming home v2 2015-05-19 14:01:51 +02:00
sarah garcin 76c59dc2a9 change home v2 feature, add class 2015-05-19 14:01:06 +02:00
Bachir Soussi Chiadmi ae3b3d3895 scss
added ascii art
fixed some media querys for mobile
2015-05-18 19:03:00 +02:00
Bachir Soussi Chiadmi d858f00e17 removed obsolete mixins
like pb() pl() mb() bgc() bgca()
2015-05-18 17:42:53 +02:00
Bachir Soussi Chiadmi f28719a994 fixed gruntfile, fixed modal buttons, fixed .gitignore .sass-cache folder 2015-05-18 16:32:24 +02:00
Bachir Soussi Chiadmi 922a2da1e5 Merge branch 'prod' into homeV2 2015-05-18 14:43:16 +02:00
Bachir Soussi Chiadmi 26bb2de5b8 updated feature admin
added materiau localisation exposed filtre
2015-05-18 14:33:58 +02:00
Bachir Soussi Chiadmi e4b76f4756 fixed libraries mis-path bug from theme refactoring 2015-05-16 15:29:08 +02:00
Bachir Soussi Chiadmi 2686166df2 Merge branch 'theme-refactoring' of https://bitbucket.org/bachysoucy/materio-base-d7 into homeV2 2015-05-16 14:51:57 +02:00
Bachir Soussi Chiadmi 1f211d5348 Merge branch 'prod' into homeV2 2015-05-16 14:51:35 +02:00
Bachir Soussi Chiadmi b3c85e79c6 improved mandrill callback 2015-05-16 14:50:28 +02:00
Bachir Soussi Chiadmi 2ffa37fefa updated home V2 feature 2015-05-16 14:24:02 +02:00
Bachir Soussi Chiadmi 70151f23e1 added home v2 feature 2015-05-15 09:44:14 +02:00
Bachir Soussi Chiadmi 79bd95aeec Merge branch 'theme-refactoring' into homeV2 2015-05-15 09:42:23 +02:00
Bachir Soussi Chiadmi 3a53525bf9 fixed title localisation display on admin views 2015-05-14 19:23:45 +02:00
Bachir Soussi Chiadmi 54787232fb upadted users admin view after uc_roles patch 2015-05-13 14:29:05 +02:00
Bachir Soussi Chiadmi 69c5b7ee5c patche ubercart to add expiration date field on views
https://www.drupal.org/node/419700
2015-05-13 13:18:06 +02:00
Bachir Soussi Chiadmi 8d141a61e0 updated navigation menu 2015-05-11 16:05:53 +02:00
Bachir Soussi Chiadmi 19a68f970e removed credit card from ubercart 2015-05-11 15:21:34 +02:00
Bachir Soussi Chiadmi de8f5e4ccc created materio rss feature 2015-05-11 15:13:37 +02:00
Bachir Soussi Chiadmi 442d89c948 updated and patched views_php to fixe the pager bug
https://www.drupal.org/node/2484407
2015-05-11 14:33:53 +02:00
Bachir Soussi Chiadmi 3adb83ccf7 added site/all/translations to .gitignore 2015-05-07 12:08:44 +02:00
Bachir Soussi Chiadmi 68b11d7a9b fix elysia_cron icons bug
see patch https://www.drupal.org/node/2096571
2015-05-07 12:05:46 +02:00
sarah garcin 58e171be01 clean directory 2015-05-06 15:48:01 +02:00
sarah garcin da4d135279 librairies to bower 2015-05-06 15:05:01 +02:00
sarah garcin 1313e1f0e2 debug css 2015-05-06 15:04:39 +02:00
sarah garcin e4885c3a5d add custom materio icon 2015-05-06 12:36:27 +02:00
Bachir Soussi Chiadmi f8a18606ba added watchdog mandrill result hook 2015-05-06 11:09:06 +02:00
Bachir Soussi Chiadmi 23b96ab26f grrrrr 2015-05-05 19:12:51 +02:00
Bachir Soussi Chiadmi 8c920e81df grrrrr 2015-05-05 19:10:25 +02:00
Bachir Soussi Chiadmi 202993e68e grrrrr 2015-05-05 19:08:05 +02:00
Bachir Soussi Chiadmi 8589ce7c28 grrrrr 2015-05-05 19:06:47 +02:00
Bachir Soussi Chiadmi 17580e8eba grrrrr 2015-05-05 19:06:01 +02:00
Bachir Soussi Chiadmi ca9530466a grrrrr 2015-05-05 18:42:39 +02:00
Bachir Soussi Chiadmi 31ede7287a grrrrr 2015-05-05 18:41:34 +02:00
Bachir Soussi Chiadmi be2054c163 grrrrr 2015-05-05 18:36:26 +02:00
Bachir Soussi Chiadmi a20d86efbf bug fixed 2015-05-05 18:32:32 +02:00
Bachir Soussi Chiadmi 0795a2a514 grrrrr 2015-05-05 18:27:34 +02:00
Bachir Soussi Chiadmi c92d7ed737 added simplenews_spool management to try to fix mandrill rejected bug 2015-05-05 18:26:12 +02:00
Bachir Soussi Chiadmi 923b407498 fixed mandatory address field on company nodes. + added node_modules to .gitignore 2015-05-05 12:08:23 +02:00
Bachir Soussi Chiadmi ceeefdd109 updated features (removed ubercart card payement dependencie) 2015-05-04 12:29:16 +02:00
sarah garcin a1fd56580b add icon 2015-05-01 16:31:29 +02:00
sarah garcin 23c085213e refactoring - transition + media queries - bug with icon and princing grid 2015-04-30 16:36:41 +02:00
sarah garcin 0ba300fe22 less to sass - need to integrate transition, button and media queries 2015-04-29 22:47:56 +02:00
sarah garcin 7763d08111 Merge branch 'theme-refactoring' of https://bitbucket.org/bachysoucy/materio-base-d7 into theme-refactoring 2015-04-29 11:12:19 +02:00
sarah garcin e1819172e9 clea, 2015-04-29 11:12:02 +02:00
Bachir Soussi Chiadmi 08b4b2dbbb installed grunt 2015-04-27 17:41:32 +02:00
sarah garcin 42940e2cff starting to convert style from less to sass 2015-04-27 14:51:27 +02:00
sarah garcin 9dfbaeb05a add bower 2015-04-27 14:50:11 +02:00
sarah garcin d69e29e3be gui.less to gui.scss 2015-04-27 14:49:40 +02:00
Bachir Soussi Chiadmi b85dc130d6 updated CER from 7.x-2.x-dev (2013-mai-01) to 7.x-2.x-dev (2014-aoû-08) 2015-04-20 20:26:13 +02:00
Bachir Soussi Chiadmi d8626dbb2d updated patched modules liste 2015-04-20 20:21:13 +02:00
Bachir Soussi Chiadmi 4d3a184a81 updated field_group from 1.3 to 7.x-1.4 2015-04-20 20:06:12 +02:00
Bachir Soussi Chiadmi eeb0df349d updated flag module to 7.x-3.6 (2015-mar-02) 2015-04-20 20:01:42 +02:00
Bachir Soussi Chiadmi 785dee0639 updated vieo_embed_field 2015-04-20 19:49:19 +02:00
Bachir Soussi Chiadmi 9afc105c7e updated nodeformcols module to 7.x-1.0 (2014-jan-15) 2015-04-20 19:39:05 +02:00
Bachir Soussi Chiadmi 0cd6215a32 upadted feedback module
didn't repatched it for email notification since rules hooks semmes to be added to the module
added the old patch for memory
2015-04-20 19:31:48 +02:00
Bachir Soussi Chiadmi c5028bffd3 updated and repatched search_api_solr module
no need for patch anymore
see https://www.drupal.org/node/1846860#comment-8137979
2015-04-20 19:22:33 +02:00
Bachir Soussi Chiadmi ca9413af4d updated and repatched search_api module
please check this thread : Decide on strategy for language aware search https://www.drupal.org/node/1393058
2015-04-20 19:18:35 +02:00
Bachir Soussi Chiadmi d3dcf44a1e updated features after last modules updates 2015-04-20 18:44:52 +02:00
Bachir Soussi Chiadmi 6737f9faa1 more module updates 2015-04-20 18:23:59 +02:00
Bachir Soussi Chiadmi 322dd995bf more module updates 2015-04-20 18:21:45 +02:00
Bachir Soussi Chiadmi cde7b73a73 more module updates 2015-04-20 18:19:49 +02:00
Bachir Soussi Chiadmi 2121a356b3 more module updates 2015-04-20 18:13:58 +02:00
Bachir Soussi Chiadmi 55b23a2cec more module updates 2015-04-20 18:07:22 +02:00
Bachir Soussi Chiadmi 134c8b8338 more module updates 2015-04-20 18:04:48 +02:00
Bachir Soussi Chiadmi 7c85261e56 more module updates 2015-04-20 18:02:17 +02:00
Bachir Soussi Chiadmi 37fbabab56 non security modules update 2015-04-20 16:32:07 +02:00
Bachir Soussi Chiadmi 6a8d30db08 updated print template for print module V2 2015-04-20 15:41:08 +02:00
Bachir Soussi Chiadmi d5a03170e4 upadted print module config 2015-04-20 15:36:24 +02:00
Bachir Soussi Chiadmi 36b5937b9e updated print module on contenttype feature 2015-04-20 15:17:51 +02:00
Bachir Soussi Chiadmi 49f9128c96 updated features 2015-04-20 15:10:48 +02:00
Bachir Soussi Chiadmi 46b448c2a2 removed editmenu module 2015-04-20 15:07:04 +02:00
Bachir Soussi Chiadmi 73186732c3 switch from edit menu to admin_menu with admin_menu_source for administrator 2015-04-20 14:57:52 +02:00
Bachir Soussi Chiadmi f71bfe281e bug fixe with print module V2 2015-04-20 13:09:47 +02:00
Bachir Soussi Chiadmi 9de02bab38 repatched includes/entity.inc
see https://www.drupal.org/node/1003788
2015-04-19 21:51:44 +02:00
Bachir Soussi Chiadmi 6719ca32c7 repatched user module
see https://www.drupal.org/node/1754162
2015-04-19 21:35:21 +02:00
Bachir Soussi Chiadmi e89afbf603 security update for addressfiled_token 2015-04-19 21:20:32 +02:00
Bachir Soussi Chiadmi a1856277e5 added patch to repos 2015-04-19 21:14:24 +02:00
Bachir Soussi Chiadmi 7becdeff92 repatched views module 2015-04-19 21:13:38 +02:00
Bachir Soussi Chiadmi f55c541343 added patch to repos 2015-04-19 21:13:13 +02:00
Bachir Soussi Chiadmi 1f82c4ef9b repatched entityrefeerence module 2015-04-19 21:04:36 +02:00
Bachir Soussi Chiadmi c0af9037e9 updated gitignore 2015-04-19 21:03:38 +02:00
Bachir Soussi Chiadmi b3221c71e2 security updates
have to check views and entityreference for custom patches
2015-04-19 20:45:16 +02:00
Bachir Soussi Chiadmi 802ec0c6f3 update core to 7.36 2015-04-19 19:33:23 +02:00
Bachir Soussi Chiadmi 6de56c702c added patched modules list 2015-04-19 17:46:58 +02:00
Bachir Soussi Chiadmi f2b8ace9b7 FINAL suepr merge step : added all modules to this super repos 2015-04-19 16:46:59 +02:00
Bachir Soussi Chiadmi 7b6bd36fea merged entity_translation_search_api submodule 2015-04-19 16:29:28 +02:00
Bachir Soussi Chiadmi 8dc0b20c89 merged idmaterio submodule 2015-04-19 16:23:19 +02:00
Bachir Soussi Chiadmi 87f453cf20 merged selectList submodule 2015-04-19 16:21:36 +02:00
Bachir Soussi Chiadmi 5594bacfa9 some js not commited a long time ago .... 2015-04-19 16:20:25 +02:00
Bachir Soussi Chiadmi 8d74b0bb06 merged filter_path_alias submodule 2015-04-19 16:18:02 +02:00
Bachir Soussi Chiadmi b285de8b3a merged migrate_materio submodule 2015-04-19 16:15:14 +02:00
Bachir Soussi Chiadmi 775d25dbcc merged contentadminrelink submodule 2015-04-19 16:12:49 +02:00
Bachir Soussi Chiadmi a181091a14 merged tode submodule 2015-04-19 16:10:08 +02:00
Bachir Soussi Chiadmi 72cf8934c3 merged editmenu submodule 2015-04-19 16:06:48 +02:00
Bachir Soussi Chiadmi 627216cb77 some css not commited a long time ago 2015-04-19 16:05:18 +02:00
Bachir Soussi Chiadmi 8ff8fcd8da merged search_api submodule 2015-04-19 16:01:08 +02:00
Bachir Soussi Chiadmi 178cfe05d0 merged search_api_solr submodule 2015-04-19 15:57:04 +02:00
Bachir Soussi Chiadmi 879cd137d5 merged search_api_page submodule 2015-04-19 15:54:49 +02:00
Bachir Soussi Chiadmi 7b975a5cab merged wysiwyg submodule 2015-04-19 15:51:20 +02:00
Bachir Soussi Chiadmi ad76968844 merged views submodule 2015-04-19 15:48:20 +02:00
Bachir Soussi Chiadmi c2252c8f9a merged term_reference_tree submodule 2015-04-19 15:37:07 +02:00
Bachir Soussi Chiadmi 1be1c89407 WARNING don't now where i am here :/ 2015-04-19 15:33:58 +02:00
Bachir Soussi Chiadmi aceb299147 merged entityreference submodule 2015-04-19 15:18:46 +02:00
Bachir Soussi Chiadmi 404757203b merged CER submodule 2015-04-19 15:13:02 +02:00
Bachir Soussi Chiadmi f0531608b7 merged field_group submodule. TODO test new version of field_group, IDs seem to be removed ... 2015-04-19 15:09:16 +02:00
Bachir Soussi Chiadmi 28db07faf7 merged flag_lists submodule. TODO a new version is officially available compatible with flag 3 branch, TEST IT! 2015-04-19 15:01:19 +02:00
Bachir Soussi Chiadmi 88c1012c48 merged feedback submodule 2015-04-19 13:55:49 +02:00
Bachir Soussi Chiadmi a494bb4627 merged materiobasemod submodule 2015-04-19 13:47:39 +02:00
Bachir Soussi Chiadmi 894a4849e0 aadded gui_ck_fw 2015-04-19 13:42:54 +02:00
Bachir Soussi Chiadmi 886114f49b merged features sudmodule 2015-04-19 13:34:58 +02:00
Bachir Soussi Chiadmi ae12eada47 changed gitignore first step of merging all subtrees second 2015-04-19 13:22:18 +02:00
Bachir Soussi Chiadmi 51cc1bb7b2 changed gitignore first step of merging all subtrees 2015-04-19 13:18:35 +02:00
Bachir Soussi Chiadmi f63556f674 new feature materio user import 2015-02-24 13:04:35 +01:00
Bachir Soussi Chiadmi 29079eeb84 updated all features with last database from inline 2015-02-23 11:27:47 +01:00
Bachir Soussi Chiadmi bf88fdf0b9 added RewriteBase to .htaccess 2014-12-08 11:59:20 +01:00
Bachir Soussi Chiadmi 265c4ab336 fixed vreve search for free users 2014-10-31 19:12:53 +01:00
Bachir Soussi Chiadmi c36797f2bb splited search in two steps, 1 only taxonomy, 2 full text less 1 2014-10-22 20:30:29 +02:00
Bachir Soussi Chiadmi e5b63e455f removed advanced search code 2014-10-21 19:08:52 +02:00
Bachir Soussi Chiadmi ab1e9ae0ff bugfixe : index on advanced search tree was wrong, wasn't tid 2014-10-03 17:28:16 +02:00
Bachir Soussi Chiadmi 6b3f29142b removed a dsm() 2014-10-03 17:22:06 +02:00
Bachir Soussi Chiadmi 77450f1aad removed a dsm() 2014-10-03 17:18:44 +02:00
Bachir Soussi Chiadmi 11617ec99c advanced search :
separate tree terms generation and form generation
fixed a php notice
2014-10-03 16:48:07 +02:00
Bachir Soussi Chiadmi d1b96a77a6 feature admin : added navigation menu link items 2014-10-01 19:01:43 +02:00
Bachir Soussi Chiadmi 077d83613e bugfixe : companies page fixe views bug (relation) 2014-10-01 18:54:10 +02:00
Bachir Soussi Chiadmi d2cffdeddd improved better search
activated terms filtration regarding useinadvancedsearch term field
added all children of level 2 terms
2014-09-27 13:02:00 +08:00
Bachir Soussi Chiadmi 4237cb8edb bugfixe
= []; is not working on production server
2014-09-27 10:03:18 +08:00
Bachir Soussi Chiadmi 88d4cf09dc Merge branch 'bettersearch' into prod
added advanced to prod branch for inline production
2014-09-27 09:58:24 +08:00
Bachir Soussi Chiadmi 1cc9a63c46 code cleaning 2014-09-27 09:58:09 +08:00
Bachir Soussi Chiadmi 0bba2d0657 bugfixe : i18n was filtrering to much terms with taxonomy_get_tree
fixed in materio_taxonomy module with query alter
2014-09-16 21:09:06 +08:00
Bachir Soussi Chiadmi 8e138e1153 bugfix 2014-09-16 16:51:00 +08:00
Bachir Soussi Chiadmi ccb121e83a bugfix: location change on webform adhesion block the form
-> do not fill default value if form is rebuilded
2014-09-16 16:48:13 +08:00
Bachir Soussi Chiadmi 8f54fcd944 some changes in the form structure 2014-09-16 16:46:55 +08:00
Bachir Soussi Chiadmi 98f738f951 cleaning : removed some whitespaces 2014-09-10 21:05:17 +08:00
Bachir Soussi Chiadmi ef50154a49 bugfixe : autocomplete and guillemets 2014-09-10 21:04:02 +08:00
Bachir Soussi Chiadmi 982122065e bugfix : floders on preview mode 2014-09-10 19:51:39 +08:00
Bachir Soussi Chiadmi 80e491f1d8 fixed country ID on uc_checkout_form 2014-09-05 16:10:29 +02:00
Bachir Soussi Chiadmi c5f5eb4f64 added some comments 2014-09-05 11:37:36 +02:00
Bachir Soussi Chiadmi 7d410e8393 updated subscription : removed coupons 2014-09-04 14:31:37 +02:00
Bachir Soussi Chiadmi afce4662bd fixe 2014-09-03 14:14:19 +02:00
Bachir Soussi Chiadmi ab40bcf861 commented some dsm 2014-09-02 17:04:04 +02:00
Bachir Soussi Chiadmi 497a0108ae added phone field to subbscription form and billing form 2014-08-28 16:42:57 +02:00
Bachir Soussi Chiadmi 9f3444676a features : Materio content type 2014-08-27 16:13:36 +02:00
Bachir Soussi Chiadmi 0545fabe49 features : updated permissions for User Test UC 2014-08-27 16:04:47 +02:00
Bachir Soussi Chiadmi 37ac75fc59 features : Materio Subscriptions
updated permissions for User Test UC
2014-08-27 15:54:13 +02:00
Bachir Soussi Chiadmi 6fdb4e0dc9 setup solr properties for advanced search 2014-08-27 15:27:15 +02:00
Bachir Soussi Chiadmi 124e1a7bc2 created advanced search form 2014-07-29 12:27:02 +02:00
Bachir Soussi Chiadmi 7ee6c9dc12 created advanced search block 2014-07-16 17:09:23 +02:00
Bachir Soussi Chiadmi e9a136db4c added admin settings for advanced search 2014-07-16 17:07:56 +02:00
Bachir Soussi Chiadmi f515e148f4 updated subscriptions 2014-07-15 20:40:46 +02:00
Bachir Soussi Chiadmi aed0b98da2 updated administration feature 2014-07-15 20:39:51 +02:00
Bachir Soussi Chiadmi ccd86a08a4 updated subscriptions 2014-07-15 20:21:38 +02:00
Bachir Soussi Chiadmi 8f32d4e98b fixed a message again 2014-07-15 20:02:50 +02:00
Bachir Soussi Chiadmi e82e3250b3 fixed a typo 2014-07-15 19:53:17 +02:00
Bachir Soussi Chiadmi 2e1e0cc05b improved the message to people who access to the serach tool without an account
cf link from daily materiO'
2014-07-15 19:45:08 +02:00
Bachir Soussi Chiadmi 488d4c19aa removed a dsm() 2014-07-15 19:43:43 +02:00
Bachir Soussi Chiadmi ce18a79a80 fixed materiaux liés display
added test utilisateur role
2014-07-15 17:36:36 +02:00
Bachir Soussi Chiadmi 41e7f80383 updated/sunc feautures betxeen local and online 2014-07-11 18:32:59 +02:00
Bachir Soussi Chiadmi 8aabfe2592 add marks to terms coming from autocompletion 2014-07-11 17:03:45 +02:00
Bachir Soussi Chiadmi 847eb41741 removed words and keep sentence search request 2014-07-11 16:43:40 +02:00
Bachir Soussi Chiadmi 6c4d1ed8f5 removed unusable watchdog 2014-07-11 16:29:32 +02:00
Bachir Soussi Chiadmi 854a6cc680 trying to fixe this fucking bug 2014-07-11 15:32:21 +02:00
Bachir Soussi Chiadmi 4691968631 fixed bundle_filters php notice 2014-07-11 15:00:35 +02:00
Bachir Soussi Chiadmi 10c50db9e2 fixed search index name bug 2014-07-11 14:55:19 +02:00
Bachir Soussi Chiadmi a645ef87b4 fixed search index name bug 2014-07-11 14:35:16 +02:00
Bachir Soussi Chiadmi d214a86eeb fixed address field bug 2014-07-10 20:29:00 +02:00
Bachir Soussi Chiadmi 5cbbf7cbf5 fixed address field bug 2014-07-10 20:27:17 +02:00
Bachir Soussi Chiadmi 3310c6fad6 cleaned maintenance/index.html 2014-07-10 20:03:34 +02:00
Bachir Soussi Chiadmi 4756fdaf77 add permission to access to payment
prefile webform 11186 with recorded user profile infos
2014-07-10 19:47:43 +02:00
Bachir Soussi Chiadmi 5835745cc2 merge sandbox with prod 2014-07-07 16:35:39 +02:00
Bachir Soussi Chiadmi bf41479abc added some comment on source code 2014-07-07 16:04:41 +02:00
Bachir Soussi Chiadmi f4ae3c9055 fixed results summary 2014-07-07 12:49:40 +02:00
Bachir Soussi Chiadmi 28deeac474 materio admin : created duplicate mails page admin 2014-07-03 18:52:20 +02:00
Bachir Soussi Chiadmi 0c71144833 disabled submit on registration to avoid duplicate account creation 2014-07-03 17:27:36 +02:00
Bachir Soussi Chiadmi f881f8b638 fixed mispelling 2014-07-03 16:13:44 +02:00
Bachir Soussi Chiadmi 1eb8bb9de8 change pricing to Pricing 2014-07-02 18:24:34 +02:00
Bachir Soussi Chiadmi 5b26e36355 highlighted the FOUND X RESULTS sentence 2014-07-02 18:21:39 +02:00
Bachir Soussi Chiadmi 9df43555ac restrict access to materials descriptions for free users 2014-07-02 16:24:54 +02:00
Bachir Soussi Chiadmi e2183f0a0d fixed viewmode block visibility
depending on permission as before but also on node type
visible only with materiaux and breves
2014-07-01 18:15:47 +02:00
Bachir Soussi Chiadmi c4d8c34e1a Viewmode block
restrict display on node page for materiau and breve
2014-04-30 10:41:52 +02:00
Bachir Soussi Chiadmi 748548f8f4 cleaned file 2014-04-30 10:41:24 +02:00
Bachir Soussi Chiadmi 5d0c233fec bug fixed 2014-04-28 17:20:50 +02:00
Bachir Soussi Chiadmi 05a41ebf3a bug fixe ? 2014-04-28 17:09:33 +02:00
Bachir Soussi Chiadmi a08a5287fc bug fixe ? 2014-04-28 17:05:27 +02:00
Bachir Soussi Chiadmi ae72f70488 bug fixe ? 2014-04-28 16:53:58 +02:00
Bachir Soussi Chiadmi c8a37f4255 Trailing slash + bug fixe
http://studio.g-u-i.net/fr/materio/node/1368
2014-04-28 16:29:17 +02:00
Bachir Soussi Chiadmi df548917f6 improved mail templates 2014-04-28 11:42:36 +02:00
Bachir Soussi Chiadmi 40fe76b2cf improved mail templates (wysiwyg filter) 2014-04-28 11:19:49 +02:00
Bachir Soussi Chiadmi 5b7b67573f updated simplenews templates 2014-04-25 18:54:36 +02:00
Bachir Soussi Chiadmi a613426482 updated simplenews templates 2014-04-25 18:48:28 +02:00
Bachir Soussi Chiadmi e371e746ff updated simplenews templates 2014-04-25 18:46:28 +02:00
Bachir Soussi Chiadmi 148e2db56e updated templates 2014-04-25 18:42:37 +02:00
Bachir Soussi Chiadmi 332c17c25c change body field height systematicaly 2014-04-25 17:25:48 +02:00
Bachir Soussi Chiadmi a64d6e34d8 upadted also test template 2014-04-25 17:12:19 +02:00
Bachir Soussi Chiadmi 6394330226 removed icons from body template
added to footer template on materiobasetheme theme
2014-04-25 16:57:33 +02:00
Bachir Soussi Chiadmi 76efcb0778 added simplenews local actions + change template selection from query to path 2014-04-25 16:13:11 +02:00
Bachir Soussi Chiadmi f6d5c40ae2 removed dsm() 2014-04-25 15:15:52 +02:00
Bachir Soussi Chiadmi 9d2fee4ddd simplenews prepopulation improvement 2014-04-25 15:11:39 +02:00
Bachir Soussi Chiadmi d7dddd5764 added template selection regarding simplenews categorie (trough url query) 2014-04-23 18:40:19 +02:00
Bachir Soussi Chiadmi 4d0605604f Simplenews default body content ofr content
daily materio html template through hook_form_alter
2014-04-23 16:49:49 +02:00
Bachir Soussi Chiadmi 100abc9a3a materio_search_api_ajax
add optional viewmode paramater for ajax call materio_search_api_ajax_node
2014-02-28 20:00:30 +01:00
Bachir Soussi Chiadmi 094eb50691 bug fixe 2014-02-21 21:06:23 +01:00
Bachir Soussi Chiadmi 7b99c14d96 bug fixe 2014-02-21 21:01:03 +01:00
Bachir Soussi Chiadmi c06be9a44e Icons
re-added icons, why they didn't be here, i don't know ...
2014-02-21 19:49:45 +01:00
Bachir Soussi Chiadmi 6ccf2ddb91 SOLR : autocompletion accent & companie tranlation
accent : added a custom term propertie which duplicate the term name to index it without accent
companie : replaced the custom term propertie by a node (materiau) property
           which retrieve the companie info frome the tode node
2014-02-19 16:59:29 +01:00
Bachir Soussi Chiadmi 3757a19ce7 materio_search_api
updated dynamic field definition
https://drupal.org/comment/8188439#comment-8188439
2014-02-07 11:27:33 +01:00
Bachir Soussi Chiadmi 891166f86e removed patch : own dynamic field types
since committed by drunken monkey
https://drupal.org/comment/8137979#comment-8137979
2014-02-07 10:43:46 +01:00
Bachir Soussi Chiadmi 85251183d6 NODE_PUBLISED : in previous patches i commented the next line, why ? maybe will have to do it again 2014-02-07 10:32:26 +01:00
Bachir Soussi Chiadmi 54ee5c7b3a taxo term translation bug : added reference to bug fix in comment 2014-02-07 10:29:08 +01:00
Bachir Soussi Chiadmi 6402fc7ab8 re-added own boosts 2014-02-07 10:10:15 +01:00
Bachir Soussi Chiadmi d7303905a0 updated to 7.x-1.4 2014-02-07 10:05:53 +01:00
Bachir Soussi Chiadmi cf03e9ca52 updated to 7.x-1.11 2014-02-07 10:01:18 +01:00
Bachir Soussi Chiadmi 60cc747699 materio_user :: set the definitive product NID in cartlink 2013-12-09 18:46:31 +01:00
Bachir Soussi Chiadmi d9298146fa materio_user change product id for matching with basebeta.materio.com /|\ WARNING will not work anymore on dev or prod /|\ have to backup prod to sandbox and dev AND reconfigure the store (recreate the product subscription) before set the definitive ID 2013-12-09 18:02:35 +01:00
Bachir Soussi Chiadmi 1cc99f26e1 bug fixe materio_user 2013-12-09 17:28:49 +01:00
Bachir Soussi Chiadmi 5cde537e0a updated features materio_subscrition and materio_user_profile 2013-12-09 17:22:25 +01:00
Bachir Soussi Chiadmi 0799729429 materio_user : membership form auto fill profil2 adherent fields, checkout form prepopulated with profile2 adherent fields 2013-12-08 20:02:06 +01:00
Bachir Soussi Chiadmi 3fe3dde8c2 membership webform submit fill cart then redirect to checkout, HO YEAH 2013-12-07 16:31:37 +01:00
Bachir Soussi Chiadmi 5d6f96ed0e start term search mode on materio_search_api_ajax, NOT FINISHED 2013-12-07 11:55:28 +01:00
Bachir Soussi Chiadmi 983f51e711 fixe @koala-prepend on materio_flag.js 2013-12-07 11:48:53 +01:00
Bachir Soussi Chiadmi 85be86a9e4 better error message on materio_user.js login/register ajax submit 2013-12-07 11:48:00 +01:00
Bachir Soussi Chiadmi ffff23584e removed trace from materio_user.js 2013-12-07 11:15:03 +01:00
Bachir Soussi Chiadmi 770e2155bb add some trace to materio_user.js for debigging 2013-12-07 11:12:32 +01:00
Bachir Soussi Chiadmi 90c6d5e6e9 fixe @koala-prepend 2013-12-06 12:46:57 +01:00
Bachir Soussi Chiadmi e1a04d9b8e commented trace 2013-12-06 12:41:06 +01:00
Bachir Soussi Chiadmi 3d36e980af json.return IE bug fixe suite + misc 2013-12-05 15:35:14 +01:00
Bachir Soussi Chiadmi acb87f238a repaced .return json property bye .rendered or other, because IE doesn't like return 2013-12-05 15:32:34 +01:00
Bachir Soussi Chiadmi 7230dafd5f replaced ch.js files by min.js" 2013-12-05 15:29:25 +01:00
Bachir Soussi Chiadmi 9af55b03bd deleted js-ck files 2013-12-05 15:26:10 +01:00
Bachir Soussi Chiadmi 52d0c3b77e removed dsm from materio_admin 2013-11-10 14:38:13 +01:00
Bachir Soussi Chiadmi 794ccba61a created materio_admin module 2013-11-10 14:08:11 +01:00
Bachir Soussi Chiadmi 925324448b materio_user_rules typo fixe 2013-11-08 22:36:26 +01:00
Bachir Soussi Chiadmi 64ebb28c01 updated materio_user_rules : rules event on user validation+has subscribed works 2013-11-08 22:34:54 +01:00
Bachir Soussi Chiadmi d35f79e2cf created materio_user_rules module 2013-11-08 21:09:48 +01:00
Bachir Soussi Chiadmi c3c0c71945 fixe access mybookmarks block fixe 2013-11-03 16:11:14 +01:00
Bachir Soussi Chiadmi 91c826322e typo and strict php warning fixe 2013-11-03 15:33:11 +01:00
Bachir Soussi Chiadmi ab51102cd0 improve message after registration 2013-10-30 20:20:06 +01:00
Bachir Soussi Chiadmi 77414c7cb9 bug fixe 2013-10-30 20:05:27 +01:00
Bachir Soussi Chiadmi 7aa6dfe191 improve modale registration and login forms 2013-10-30 19:59:03 +01:00
Bachir Soussi Chiadmi ca6c5bd4fa improve modal register error display 2013-10-30 18:36:19 +01:00
Bachir Soussi Chiadmi e960755e20 avoid strict warnig php error 2013-10-30 18:18:02 +01:00
Bachir Soussi Chiadmi 09d80d2c63 modale register bug fix 2013-10-30 18:09:04 +01:00
Bachir Soussi Chiadmi 5daabaaf5a modale register bug fix 2013-10-30 18:03:56 +01:00
Bachir Soussi Chiadmi 8909491a12 new membership and account creation process : modal and form is in a separated page 2013-10-30 17:53:15 +01:00
Bachir Soussi Chiadmi 051455cd71 for simple users, search find news and related materiaux only if these materiaux also match with the search 2013-10-29 16:28:13 +01:00
Bachir Soussi Chiadmi 235e57d8e9 patched for email sending on each feedback creation https://drupal.org/node/353548#comment-7130746 2013-10-12 13:27:26 +02:00
Bachir Soussi Chiadmi ca63b9bbca updated to 7.x-2.x-dev (2013-Mar-04) 2013-10-12 13:24:57 +02:00
Bachir Soussi Chiadmi 7a46e22394 refactoring of membership form 2013-10-08 17:44:53 +02:00
Bachir Soussi Chiadmi 3bdbc68690 replace register form to join us link on home login block 2013-10-08 14:26:08 +02:00
Bachir Soussi Chiadmi 39759425ce change dependencies infos to CER 2013-09-26 19:51:09 +02:00
Bachir Soussi Chiadmi 62b7436183 repatched for custom dynmaic field definition : https://drupal.org/node/1846860#comment-7805861 2013-09-26 16:46:14 +02:00
Bachir Soussi Chiadmi d8237ffb99 updated to 1.2 2013-09-26 16:23:17 +02:00
Bachir Soussi Chiadmi a30917d1d2 repatched for own boosts options & avoid published filter 2013-09-26 16:05:44 +02:00
Bachir Soussi Chiadmi e6aed1cba0 removed ids from div render 2013-09-26 15:58:19 +02:00
Bachir Soussi Chiadmi 16ed68abf6 first import 1.3 2013-09-26 15:57:13 +02:00
Bachir Soussi Chiadmi 128640cd15 upadted to 1.8 2013-09-26 15:49:26 +02:00
Bachir Soussi Chiadmi 7e3ef32d18 update for 2.x version 2013-09-26 15:31:44 +02:00
Bachir Soussi Chiadmi d4d5acf837 flag 3.2 compatibility 2013-09-25 15:25:25 +02:00
Bachir Soussi Chiadmi 2b45f07449 increase number of results for autocomplete searchapi 2013-09-24 10:16:21 +02:00
Bachir Soussi Chiadmi f47c978520 user password bug fixe bis 2013-09-23 23:52:22 +02:00
Bachir Soussi Chiadmi 4362f6dc23 user password bug fixe 2013-09-23 23:49:50 +02:00
Bachir Soussi Chiadmi eeccd6a4d2 search field default value : search among our n cards 2013-09-20 12:46:38 +02:00
Bachir Soussi Chiadmi 8672e5eb9f changed premissions 2013-09-06 16:59:50 +02:00
Bachir Soussi Chiadmi 9eb6fe8360 filter didactique on "who we are" page by field displayed_in_whoweare
Signed-off-by: bachy <git@g-u-i.net>
2013-07-02 11:25:37 +02:00
bachy 2d18c524eb responsive : viewmodes
Signed-off-by: bachy <git@g-u-i.net>
2013-06-08 18:58:18 +02:00
bachy afd4de26e7 added some spans
Signed-off-by: bachy <git@g-u-i.net>
2013-06-05 21:26:12 +02:00
bachy 7c486da7c5 deleted materio_title_access module files
Signed-off-by: bachy <git@g-u-i.net>
2013-06-01 20:41:18 +02:00
bachy 0ccaf2eeeb update materio_content_types
removed materio_title_access module dependency

Signed-off-by: bachy <git@g-u-i.net>
2013-06-01 20:36:56 +02:00
bachy 5fd46660b9 merged materio_title_access and materio_page_title into materio_page_title
Signed-off-by: bachy <git@g-u-i.net>
2013-06-01 20:20:54 +02:00
bachy 70b4f2279f added materio_taxonomy for term pages perms
Signed-off-by: bachy <git@g-u-i.net>
2013-05-31 18:34:47 +02:00
bachy 2f95c828e6 didactique page
Signed-off-by: bachy <git@g-u-i.net>
2013-05-29 20:29:27 +02:00
bachy 1923036d97 bug fix
Signed-off-by: bachy <git@g-u-i.net>
2013-05-28 16:20:11 +02:00
bachy 49db4b90be restrict page title for visitors
Signed-off-by: bachy <git@g-u-i.net>
2013-05-24 19:44:36 +02:00
bachy 6c85be6c6d restrict page title on materiau node page for visitors
Signed-off-by: bachy <git@g-u-i.net>
2013-05-24 19:27:13 +02:00
bachy ee27274830 page_node_view integration
Signed-off-by: bachy <git@g-u-i.net>
2013-05-24 17:58:29 +02:00
bachy df0ec71ac7 cleaning
Signed-off-by: bachy <git@g-u-i.net>
2013-05-07 12:19:41 +02:00
bachy 93c278c5e8 change image title from textfield to text area
Signed-off-by: bachy <git@g-u-i.net>
2013-05-07 12:19:25 +02:00
bachy 13d6d3b95b new custom entity property (term become text)
Signed-off-by: bachy <git@g-u-i.net>
2013-04-24 20:50:35 +02:00
bachy e0ae80791b changed boosts
Signed-off-by: bachy <git@g-u-i.net>
2013-04-24 20:32:41 +02:00
bachy dfe36ba913 added $(document).ready to js script
Signed-off-by: bachy <git@g-u-i.net>
2013-04-23 12:08:32 +02:00
bachy caf3bf662c materio admin fix
Signed-off-by: bachy <git@g-u-i.net>
2013-04-02 14:16:36 +02:00
bachy 66e87e0bf4 updated faq (perms)
Signed-off-by: bachy <git@g-u-i.net>
2013-03-29 19:03:05 +01:00
bachy b2873ad5b1 updated admin
Signed-off-by: bachy <git@g-u-i.net>
2013-03-29 18:51:11 +01:00
bachy f43260082d updated user profile
Signed-off-by: bachy <git@g-u-i.net>
2013-03-29 18:37:15 +01:00
bachy bef27e8258 updated feedback
Signed-off-by: bachy <git@g-u-i.net>
2013-03-29 18:37:01 +01:00
bachy 443e4fc138 updated admin
Signed-off-by: bachy <git@g-u-i.net>
2013-03-29 18:36:50 +01:00
bachy 09ac2a24ac added faq
Signed-off-by: bachy <git@g-u-i.net>
2013-03-29 18:36:32 +01:00
bachy 789d8708bf bug fixe : error message
Signed-off-by: bachy <git@g-u-i.net>
2013-03-29 17:20:21 +01:00
bachy 578adab53b update to 7.x-3.6
Signed-off-by: bachy <git@g-u-i.net>
2013-03-29 17:18:33 +01:00
bachy 10c9d53c31 work around : comment query access condition
Signed-off-by: bachy <git@g-u-i.net>
2013-03-15 18:41:27 +01:00
bachy 29f7711833 added more boost 2013-03-15 17:34:17 +01:00
bachy 9cc5ba4cfa first import 7.x-1.4 2013-03-15 17:32:30 +01:00
bachy 644b7db597 fix header layout for 1024 width
Signed-off-by: bachy <git@g-u-i.net>
2013-03-13 16:18:41 +01:00
bachy 779d42d9bb entity props address for indexing fixed
Signed-off-by: bachy <git@g-u-i.net>
2013-03-13 14:56:56 +01:00
bachy 78b816920d added "address" field property to company taxonomy term, for indexation
http://studio.g-u-i.net/en/materio/node/1040
Signed-off-by: bachy <git@g-u-i.net>
2013-03-13 12:47:13 +01:00
bachy f5e39e1209 added custom field type for apache_solr (see patch against searchapi_solr)
Signed-off-by: bachy <git@g-u-i.net>
2013-03-13 12:45:44 +01:00
bachy c9912105d5 patch add custom field types
Signed-off-by: bachy <git@g-u-i.net>
2013-03-12 19:15:12 +01:00
bachy 6a402551d7 first import 2013-03-12 15:26:34 +01:00
bachy 5b845da277 flags update
Signed-off-by: bachy <git@g-u-i.net>
2013-03-12 12:46:56 +01:00
bachy 763ce99b95 bug fix
Signed-off-by: bachy <git@g-u-i.net>
2013-03-08 10:33:32 +01:00
bachy f207e56b2d bookmarks change view mode
Signed-off-by: bachy <git@g-u-i.net>
2013-03-08 10:17:19 +01:00
bachy 06a4d254c2 bookmarks fixing
Signed-off-by: bachy <git@g-u-i.net>
2013-03-07 19:04:15 +01:00
bachy de59738907 updates table tr colors
Signed-off-by: bachy <git@g-u-i.net>
2013-02-28 15:41:22 +01:00
bachy a575bce275 less compile to css
Signed-off-by: bachy <git@g-u-i.net>
2013-02-28 15:38:54 +01:00
bachy 2fdd8fb95c Merge branch '7.x' of https://bitbucket.org/bachysoucy/guibik into 7.x
Signed-off-by: bachy <git@g-u-i.net>

Conflicts:
	css/guibik.css
	less/guibik.less
2013-02-28 15:37:54 +01:00
bachy e573564b93 colors of updates table
Signed-off-by: bachy <git@g-u-i.net>
2013-02-28 15:32:55 +01:00
bachy 454adf9478 bug fix : communication between theme and module
Signed-off-by: bachy <git@g-u-i.net>
2013-02-23 12:31:22 +01:00
bachy b181133e60 t() fixe
Signed-off-by: bachy <git@g-u-i.net>
2013-02-14 23:51:01 +01:00
bachy e7d0e34651 micro text change
Signed-off-by: bachy <git@g-u-i.net>
2013-02-14 21:28:05 +01:00
bachy f0f9635e8b actuality bug fix
Signed-off-by: bachy <git@g-u-i.net>
2013-02-14 21:24:22 +01:00
bachy 7a3ee63d15 could results bug fix
Signed-off-by: bachy <git@g-u-i.net>
2013-02-14 20:56:43 +01:00
bachy 8f492c8b4e access view mode change bug fixe
Signed-off-by: bachy <git@g-u-i.net>
2013-02-14 20:32:51 +01:00
bachy 108f77c73d search "performance“ message for user with link to pricing page
Signed-off-by: bachy <git@g-u-i.net>
2013-02-14 20:00:16 +01:00
bachy 0db5022c47 !!! search api for breve
Signed-off-by: bachy <git@g-u-i.net>
2013-02-13 23:17:01 +01:00
bachy d01d0a2a7e deactivated hook_user_update for test
Signed-off-by: bachy <git@g-u-i.net>
2013-02-13 21:00:47 +01:00
bachy 2b137c6a19 added got to user/%uid/edit
Signed-off-by: bachy <git@g-u-i.net>
2013-02-13 20:48:20 +01:00
bachy cb6963919c give defined rôle on validate email
Signed-off-by: bachy <git@g-u-i.net>
2013-02-13 20:36:10 +01:00
bachy 39db0ed16d header : hide my folders if no flag list
Signed-off-by: bachy <git@g-u-i.net>
2013-02-13 19:40:42 +01:00
bachy 87edb46954 register block : login pass first, before register
Signed-off-by: bachy <git@g-u-i.net>
2013-02-13 11:01:08 +01:00
bachy f9a60fe62d Search api Solr onthologie bugfix
Signed-off-by: bachy <git@g-u-i.net>
2013-02-12 20:29:51 +01:00
bachy c60696ba2b home link block
Signed-off-by: bachy <git@g-u-i.net>
2013-02-12 14:18:13 +01:00
bachy 90adf0ad52 added icon-user to "user login" block title
Signed-off-by: bachy <git@g-u-i.net>
2013-02-11 20:38:23 +01:00
bachy 2506c8b8ac user login from membership redirect to membership : WONT WORK
Signed-off-by: bachy <git@g-u-i.net>
2013-02-11 20:37:41 +01:00
bachy d6bc2debdf membership web form validate
Signed-off-by: bachy <git@g-u-i.net>
2013-02-11 20:36:13 +01:00
bachy 438ebb75ad bug fix : disable user_register_alter for administrators
Signed-off-by: bachy <git@g-u-i.net>
2013-02-11 18:56:11 +01:00
bachy cb5ba1c633 TRANSLATABLE : "the materiO terms of services"
Signed-off-by: bachy <git@g-u-i.net>
2013-02-11 15:16:51 +01:00
bachy 432b8ee65e added login form to register block
Signed-off-by: bachy <git@g-u-i.net>
2013-02-11 15:11:27 +01:00
bachy 72e2d8a7f4 precedent bug fix was not a bug, it is incometibility with ajax_register
Signed-off-by: bachy <git@g-u-i.net>
2013-02-11 14:39:12 +01:00
bachy 2fff41d01d register block redirect bugfix
Signed-off-by: bachy <git@g-u-i.net>
2013-02-11 14:24:57 +01:00
bachy 83fbaa4669 change register-block title (more explicit)
Signed-off-by: bachy <git@g-u-i.net>
2013-02-11 13:08:40 +01:00
bachy 184a808558 update
Signed-off-by: bachy <git@g-u-i.net>
2013-02-10 22:18:51 +01:00
bachy 63465d9076 bug fix : error message
Signed-off-by: bachy <git@g-u-i.net>
2013-02-10 22:17:21 +01:00
bachy ca2ebbf0c8 register block : redirection to membership
register help messages

Signed-off-by: bachy <git@g-u-i.net>
2013-02-10 22:05:18 +01:00
bachy a59e01d581 first import
Signed-off-by: bachy <git@g-u-i.net>
2013-02-10 21:29:08 +01:00
bachy 5a82c8394d fix node link of terms of service
Signed-off-by: bachy <git@g-u-i.net>
2013-02-08 18:47:59 +01:00
bachy 1f9bef33b9 terms of service
Signed-off-by: bachy <git@g-u-i.net>
2013-02-08 18:28:25 +01:00
bachy 1e40a74e1a old database link
Signed-off-by: bachy <git@g-u-i.net>
2013-02-08 16:12:04 +01:00
bachy b8b7044eb3 register block
Signed-off-by: bachy <git@g-u-i.net>
2013-02-08 16:11:46 +01:00
bachy 739f52c1df user profiles : hide news letter from registration form
Signed-off-by: bachy <git@g-u-i.net>
2013-02-08 14:54:28 +01:00
bachy 64bf6b3fa2 content types : pages translatable
Signed-off-by: bachy <git@g-u-i.net>
2013-02-08 14:53:21 +01:00
bachy df986ba09a delete main menu feature
Signed-off-by: bachy <git@g-u-i.net>
2013-02-07 16:50:20 +01:00
bachy 1377500ccc new feature : main menu
Signed-off-by: bachy <git@g-u-i.net>
2013-02-07 16:09:28 +01:00
bachy 7bd9dd6d80 limit news to 6 month ago for visitors
Signed-off-by: bachy <git@g-u-i.net>
2013-01-31 17:41:24 +01:00
bachy e1d0639eee field localization perms 2
component added

Signed-off-by: bachy <git@g-u-i.net>
2013-01-31 17:31:44 +01:00
bachy 618d68bd70 field localization perms
Signed-off-by: bachy <git@g-u-i.net>
2013-01-31 17:17:32 +01:00
bachy 1bcda42052 display field localization
Signed-off-by: bachy <git@g-u-i.net>
2013-01-31 14:29:37 +01:00
bachy 89e7b9de6e bug fixe for taxonomie terms
Signed-off-by: bachy <git@g-u-i.net>
2013-01-30 21:29:47 +01:00
bachy 4caa0c442b first import
Signed-off-by: bachy <git@g-u-i.net>
2013-01-30 18:30:33 +01:00
bachy 18eea497c3 Merge branch 'refs/heads/7.x-solrmulticore' into 7.x 2013-01-30 14:49:12 +01:00
bachy c3f366a045 solr multicore
Signed-off-by: bachy <git@g-u-i.net>
2013-01-30 13:55:24 +01:00
bachy fc0253d9c2 print pdf
- set available print links for our view modes
- hide flags from print

Signed-off-by: bachy <git@g-u-i.net>
2013-01-15 15:57:54 +01:00
bachy a6f0f199b5 bug fix
next page with special char didn't work, added rawurldecode on keys

Signed-off-by: bachy <git@g-u-i.net>
2013-01-11 14:47:28 +01:00
bachy b20b38f514 first import
Signed-off-by: bachy <git@g-u-i.net>
2013-01-09 10:53:26 +01:00
bachy feae2e1f34 mini fixe
Signed-off-by: bachy <git@g-u-i.net>
2013-01-03 16:06:01 +01:00
bachy b0f5c3eae0 adhérent migration
Signed-off-by: bachy <git@g-u-i.net>
2013-01-03 16:04:59 +01:00
bachy bcf209570a conjunction OR ++
ajax : keys aren't args any more, because of a+b+c

Signed-off-by: bachy <git@g-u-i.net>
2013-01-03 16:04:25 +01:00
bachy b7ab35d6aa repatch for user role selection
Signed-off-by: bachy <git@g-u-i.net>
2012-12-08 12:08:37 +01:00
bachy 3b2eb43c8f rematch autocomplete search in fields
Signed-off-by: bachy <git@g-u-i.net>
2012-12-08 12:05:05 +01:00
bachy 4ef59776b0 update 7.1
Signed-off-by: bachy <git@g-u-i.net>
2012-12-08 11:59:44 +01:00
bachy f276e09115 patch url
Signed-off-by: bachy <git@g-u-i.net>
2012-12-08 11:57:58 +01:00
bachy 3eaa5817e0 change readme.txt content
Signed-off-by: bachy <git@g-u-i.net>
2012-12-07 10:59:22 +01:00
bachy 0600bf6674 with title module : empty entity_label fixed
http://drupal.org/node/1402000
Signed-off-by: bachy <git@g-u-i.net>
2012-11-30 13:27:16 +01:00
bachy 1cd7c773a5 notice php bug fixe
Signed-off-by: bachy <git@g-u-i.net>
2012-11-30 11:47:33 +01:00
bachy 2601c718c2 update
- added materio_user.module (add permission to view the profile page)
- materio_serach_api.pages : limit actu items for anonymous
- materio_search_api_ajax.pages & materio_flag.pages : redirect to real page if current page not corresponding on ajax request (solve the view mode block visibility on user edit profile page)
- materio_flag : added edit lists functionalities ++ get_list_page_title func

Signed-off-by: bachy <git@g-u-i.net>
2012-11-21 10:06:34 +01:00
bachy 61c83b5a75 removed history.js
Signed-off-by: bachy <git@g-u-i.net>
2012-11-21 09:56:38 +01:00
bachy a2b9816e52 update to 7.x-2.x-dev 10 nov 2012
Signed-off-by: bachy <git@g-u-i.net>
2012-11-20 16:30:11 +01:00
bachy f3be35fe5e first import 7.x-2.x-dev
Signed-off-by: bachy <git@g-u-i.net>
2012-11-20 16:21:31 +01:00
bachy 707403f8e7 PDF
Signed-off-by: bachy <git@g-u-i.net>
2012-11-16 22:23:59 +01:00
bachy d2285db42a New folders block nav
++
search field : select on focus

Signed-off-by: bachy <git@g-u-i.net>
2012-11-16 20:02:37 +01:00
bachy 7dafe10be1 $.event.trigger({type:'blabla
event = jQuery.Event('blabla')
…
become
$.event.trigger({type:'blabla
…

Signed-off-by: bachy <git@g-u-i.net>
2012-11-11 13:50:11 +01:00
bachy d97c0a2e45 event retriggering bug fixe
Signed-off-by: bachy <git@g-u-i.net>
2012-11-09 22:13:48 +01:00
bachy 63df1c8f3a google analytics ajax tracking
Signed-off-by: bachy <git@g-u-i.net>
2012-11-09 20:20:09 +01:00
bachy 6793ae61a6 port for flag 3.x suite : views
Signed-off-by: bachy <git@g-u-i.net>
2012-11-09 11:57:20 +01:00
bachy d3b84b7733 added .20; font size
Signed-off-by: bachy <git@g-u-i.net>
2012-11-09 11:54:34 +01:00
bachy 0e49c6cedf bug fixe : with entity translation
Signed-off-by: bachy <git@g-u-i.net>
2012-11-09 11:53:36 +01:00
bachy 948913bc82 Page title
Signed-off-by: bachy <git@g-u-i.net>
2012-11-09 11:51:55 +01:00
bachy b1bf1c9387 Flag list OK
all ajax OK

Signed-off-by: bachy <git@g-u-i.net>
2012-11-08 17:42:38 +01:00
bachy 1d11663ec4 début de modal sans ctools
Signed-off-by: bachy <git@g-u-i.net>
2012-11-01 01:10:02 +01:00
bachy df2c715315 new lists (ctools)
Signed-off-by: bachy <git@g-u-i.net>
2012-10-31 19:49:05 +01:00
bachy d77d7e5ef7 Flags :
- bookmarks OK
- flaglist DEV

Signed-off-by: bachy <git@g-u-i.net>
2012-10-30 18:11:20 +01:00
bachy 8e956c857b didactique
Signed-off-by: bachy <git@g-u-i.net>
2012-10-30 18:10:14 +01:00
bachy ef943eba75 actuality and filter templates
Signed-off-by: bachy <git@g-u-i.net>
2012-10-30 18:09:48 +01:00
bachy b750ae41c4 materio title access
Signed-off-by: bachy <git@g-u-i.net>
2012-10-30 18:09:14 +01:00
bachy 761ffba48d search results, check for access
Signed-off-by: bachy <git@g-u-i.net>
2012-10-30 18:08:52 +01:00
bachy e218aeb4da ontologie pondération
hook_entity_property_info_alter

Signed-off-by: bachy <git@g-u-i.net>
2012-10-30 18:08:24 +01:00
bachy 493d3bf780 actuality JS
Signed-off-by: bachy <git@g-u-i.net>
2012-10-30 18:07:48 +01:00
bachy f8af96a85b actuality
Signed-off-by: bachy <git@g-u-i.net>
2012-10-30 18:07:06 +01:00
bachy 2248bfd12e display search performances
Signed-off-by: bachy <git@g-u-i.net>
2012-10-30 18:04:23 +01:00
bachy 65ea77dea2 change view mode ++ type filters
Signed-off-by: bachy <git@g-u-i.net>
2012-10-30 18:03:56 +01:00
gaelg edc3e1f685 First try, should work. 2012-10-30 10:39:29 +01:00
gaelg 7022567394 Initial commit. 2012-10-30 10:35:25 +01:00
bachy 4b1685af04 EntityMalformedException PATCH
http://drupal.org/node/1595358
Signed-off-by: bachy <git@g-u-i.net>
2012-10-27 16:13:15 +02:00
bachy 7884444ec6 update 2.2 + precedent custom commits
Signed-off-by: bachy <git@g-u-i.net>
2012-10-27 15:06:38 +02:00
bachy aff5ecb650 titmice theme correction
Signed-off-by: bachy <git@g-u-i.net>
2012-10-27 15:04:07 +02:00
bachy 9a18131bcf first import 2.1
Signed-off-by: bachy <git@g-u-i.net>
2012-10-27 15:02:05 +02:00
bachy ce04398f78 message css (colors) + better-messages module
Signed-off-by: bachy <git@g-u-i.net>
2012-10-27 14:43:22 +02:00
bachy 6022c4547f User bundle filers for Roles and Status
http://drupal.org/node/1354482
Signed-off-by: bachy <git@g-u-i.net>
2012-10-27 12:42:48 +02:00
bachy a981ba0fcd Autocomplete is searching only on entity properties (not fields)
http://drupal.org/node/1691612
Signed-off-by: bachy <git@g-u-i.net>
2012-10-27 12:41:54 +02:00
bachy a3196f9486 first import 1.0-rc5
Signed-off-by: bachy <git@g-u-i.net>
2012-10-27 12:36:32 +02:00
bachy c259bc4543 update for flag 3.x
- table flags becomes flag
- replace all content_type and content_id by entity_type and entity_id
- changed flag_lists.install (new rows name entity_type & entity_id) and flags table name become flag
- factory_by_content_type('node') became factory_by_entity_type('node')
- flag_lists.views_default.inc (entity_id & entity_type)

Signed-off-by: bachy <git@g-u-i.net>
2012-10-17 18:54:47 +02:00
bachy 04d628c609 first import from 7.x-1.1
Signed-off-by: bachy <git@g-u-i.net>
2012-10-17 15:19:21 +02:00
bachy 3faebabce1 update
Signed-off-by: bachy <git@g-u-i.net>
2012-10-13 11:12:14 +02:00
bachy a7b1a91c6f bug fix
Signed-off-by: bachy <git@g-u-i.net>
2012-10-11 18:54:11 +02:00
bachy 900155d078 Merge branch '7.x' of ssh://ssh.g-u-i.net/module-tode into 7.x 2012-10-11 18:25:43 +02:00
bachy aa8698232d field formatter "Tode" for term_reference
Signed-off-by: bachy <git@g-u-i.net>
2012-10-11 18:23:30 +02:00
bachy 2543d32599 add “people create" short cut on admin/user page
Signed-off-by: bachy <git@g-u-i.net>
2012-10-09 21:37:17 +02:00
bachy 3b4f1e024f big big big update
Signed-off-by: bachy <git@g-u-i.net>
2012-10-09 21:30:27 +02:00
bachy 476ccd94fe theme able results
Signed-off-by: bachy <git@g-u-i.net>
2012-10-05 14:20:50 +02:00
bachy 86d0eb03f5 don't know
Signed-off-by: bachy <git@g-u-i.net>
2012-10-05 14:18:07 +02:00
bachy 789a40d106 JS
Signed-off-by: bachy <git@g-u-i.net>
2012-10-05 14:17:12 +02:00
bachy 2697ba8675 breves migration update
Signed-off-by: bachy <git@g-u-i.net>
2012-10-05 14:15:46 +02:00
bachy c811ffcb26 css header
Signed-off-by: bachy <git@g-u-i.net>
2012-10-05 14:14:12 +02:00
bachy c952bd330f redirect node to term alpha
Signed-off-by: bachy <git@g-u-i.net>
2012-09-26 16:36:56 +02:00
bachy 6c13226969 terms
Signed-off-by: bachy <git@g-u-i.net>
2012-09-16 15:59:49 +02:00
bachy 3ca910cf34 files, video, materiau ref
Signed-off-by: bachy <git@g-u-i.net>
2012-09-16 15:47:54 +02:00
bachy 40b0b8bae2 change source query, got translation onprepare()
Signed-off-by: bachy <git@g-u-i.net>
2012-09-16 10:04:06 +02:00
bachy 0370c6233d breves migration starting point
Signed-off-by: bachy <git@g-u-i.net>
2012-09-15 18:52:56 +02:00
bachy fb30fe966e materiobaseajax module
first ajax geed results
+ 2 different custom autocomplete func (not used for now)
	- deselect
	- searchapi

Signed-off-by: bachy <git@g-u-i.net>
2012-07-23 23:02:09 +02:00
bachy 68126583b1 addtemplate patch
http://drupal.org/node/1313676#comment-6169000
Signed-off-by: bachy <git@g-u-i.net>
2012-07-23 17:53:59 +02:00
bachy 2030a6f810 bug fixe on édit page for precedent patch
Signed-off-by: bachy <git@g-u-i.net>
2012-07-22 17:02:31 +02:00
bachy 256475e716 disable form patch
http://drupal.org/node/1512086
Signed-off-by: bachy <git@g-u-i.net>
2012-07-22 16:27:00 +02:00
bachy 5e63575d94 first import from dev
Signed-off-by: bachy <git@g-u-i.net>
2012-07-22 16:25:09 +02:00
bachy ad7809415c first import :: search autocomplete form
Signed-off-by: bachy <git@g-u-i.net>
2012-07-19 18:31:59 +02:00
bachy 0685b2dc63 compatibility with entity_translation
change values from #default (only tids) to term object if field was not on the form.

Signed-off-by: bachy <git@g-u-i.net>
2012-07-11 17:35:47 +02:00
bachy 0ed294ff52 entity_translation compatibility
Signed-off-by: bachy <git@g-u-i.net>
2012-06-19 17:23:21 +02:00
bachy addf98f5ab first import
Signed-off-by: bachy <git@g-u-i.net>
2012-06-19 16:25:59 +02:00
bachy 89159da2cf usort bug fixe
Signed-off-by: bachy <git@g-u-i.net>
2012-05-30 17:14:36 +02:00
bachy 4cf9d7b2c6 debug
ordre non respect (js compare delatas as string and not numbers)
term disparaissant (car delta identiques)
translate (entity translate) delete terms

Signed-off-by: bachy <git@g-u-i.net>
2012-05-24 23:38:22 +02:00
bachy 35a5eb3a60 bug fixing tode_url_outbound_alter
Signed-off-by: bachy <git@g-u-i.net>
2012-05-22 22:40:31 +02:00
bachy c0a9653975 add shortcuts action to materiaux/breves & companies admin pages
Signed-off-by: bachy <git@g-u-i.net>
2012-05-21 17:52:04 +02:00
bachy b920153c13 V1 RC
Signed-off-by: bachy <git@g-u-i.net>
2012-05-21 17:50:56 +02:00
bachy 18982b6700 bug fixing
ccode
homonym companies terms
tel to long set to memo instead of phone field

Signed-off-by: bachy <git@g-u-i.net>
2012-05-21 17:50:22 +02:00
bachy 7ce8d94ed9 php notice fixing
Signed-off-by: bachy <git@g-u-i.net>
2012-05-21 17:46:20 +02:00
bachy 45c41b319d improve form css
Signed-off-by: bachy <git@g-u-i.net>
2012-05-21 17:45:24 +02:00
bachy 461c93d48a Merge branch 'refs/heads/7.x-1.9-order_tracklist' into 7.x-1.9 2012-05-21 16:06:37 +02:00
bachy 47348748c4 js new items bug fixed
Signed-off-by: bachy <git@g-u-i.net>
2012-05-21 16:03:16 +02:00
bachy e31dc0d4fc first RC
Signed-off-by: bachy <git@g-u-i.net>
2012-05-18 22:43:44 +02:00
bachy 9e85e7a105 id materio
materieau = fixe famille, identifiant (against computer filed)
company = fixe multiple comp. with same names
+ misc

Signed-off-by: bachy <git@g-u-i.net>
2012-05-18 22:43:06 +02:00
bachy b861d2da15 removed dsm()
Signed-off-by: bachy <git@g-u-i.net>
2012-05-18 18:38:48 +02:00
bachy 2a9aca944c Merge branch 'refs/heads/7.x-1.9-starting_dpeth' into 7.x-1.9 2012-05-18 18:32:50 +02:00
bachy 1896d11e80 Merge branch 'refs/heads/7.x-1.9-order_tracklist' into 7.x-1.9 2012-05-18 18:30:02 +02:00
bachy b4b346b8a5 order track list item done
Signed-off-by: bachy <git@g-u-i.net>
2012-05-18 18:15:49 +02:00
bachy 93b7db54fe debug
- company : dispatch address filed in premise and sub_premise if more than 255 char
- company : avoid and record on memo tel1 if number is more than 15 char
- materiau : move product_info query in prepareRow()

Signed-off-by: bachy <git@g-u-i.net>
2012-05-16 08:05:22 +02:00
bachy 760047e9fc materiaux companies ok
+ sql improvement

Signed-off-by: bachy <git@g-u-i.net>
2012-05-13 23:02:27 +02:00
bachy 94bf329b91 Industrials OK
Company CT
account, contact, admin, sample USERS

Signed-off-by: bachy <git@g-u-i.net>
2012-05-13 13:27:58 +02:00
bachy 93b353922e widget settings défaut values fixe
Signed-off-by: bachy <git@g-u-i.net>
2012-05-09 08:13:15 +02:00
bachy df91706e57 last commit of 0.x dev
Signed-off-by: bachy <git@g-u-i.net>
2012-05-09 07:49:20 +02:00
bachy 4eda04b2f0 improvement
Signed-off-by: bachy <git@g-u-i.net>
2012-05-06 22:50:02 +02:00
bachy f4fc36431c Added starting depth for selectable items
Signed-off-by: bachy <git@g-u-i.net>
2012-05-01 16:34:06 +02:00
bachy 292f704f37 first import
Signed-off-by: bachy <git@g-u-i.net>
2012-05-01 15:30:58 +02:00
bachy 420f792a08 css
Signed-off-by: bachy <git@g-u-i.net>
2012-04-28 11:27:51 +02:00
bachy 4a958da4df parent bug on node update fixed
parent selection used to works only on node creation, now works on node creation and update

add automatic node titles snippet fro term translation

Signed-off-by: bachy <git@g-u-i.net>
2012-04-16 23:07:27 +02:00
bachy 5b16446d2f design improvment
Signed-off-by: bachy <git@g-u-i.net>
2012-04-12 10:09:11 +02:00
bachy f62d12ba55 first import
Signed-off-by: bachy <git@g-u-i.net>
2012-04-12 10:06:24 +02:00
bachy 8b5f7c5ccb autocompletedeluxe compatibility
Signed-off-by: bachy <git@g-u-i.net>
2012-04-03 22:01:12 +02:00
bachy 11d4a60bfc misc
Signed-off-by: bachy <git@g-u-i.net>
2012-04-03 21:59:36 +02:00
bachy 6a13522171 simplemenu become editmenu
Signed-off-by: bachy <git@g-u-i.net>
2012-04-03 20:26:37 +02:00
bachy 9d97a0b7b7 tode_url_outbound_alter improvement (path_alias)
Signed-off-by: bachy <git@g-u-i.net>
2012-03-18 14:38:35 +01:00
bachy 746109f079 ctools modal css + description white on black
Signed-off-by: bachy <git@g-u-i.net>
2012-03-18 14:32:03 +01:00
bachy 20ad82694b modale Tode creation
Signed-off-by: bachy <git@g-u-i.net>
2012-03-13 17:24:52 +01:00
bachy 49bdef396b improve admin interface
Signed-off-by: bachy <git@g-u-i.net>
2012-03-12 13:32:00 +01:00
bachy 9d10e145b4 micro debug
Signed-off-by: bachy <git@g-u-i.net>
2012-02-10 19:53:00 +01:00
bachy e0eae18f29 JS views save keyboard shortcut
Signed-off-by: bachy <git@g-u-i.net>
2012-02-10 19:51:10 +01:00
bachy 6ab6fc916b views integration start, not sure to keep that
Signed-off-by: bachy <git@g-u-i.net>
2012-02-07 19:46:12 +01:00
bachy dcd5bf483e design improvement
table tr hover
views filter and vbo css
add pager on top of view

Signed-off-by: bachy <git@g-u-i.net>
2012-02-07 19:42:20 +01:00
bachy 0a062a5297 preprocess_html
add icons

Signed-off-by: bachy <git@g-u-i.net>
2012-02-04 20:44:28 +01:00
bachy f50849a3a3 first import
Signed-off-by: bachy <git@g-u-i.net>
2012-02-04 18:57:50 +01:00
bachy 7f1b21c912 elements less
less elements import
page preprocess

Signed-off-by: bachy <git@g-u-i.net>
2012-02-04 18:52:39 +01:00
bachy fbaa166db8 bug correction
Signed-off-by: bachy <git@g-u-i.net>
2012-02-04 12:29:28 +01:00
bachy 60518fcfc2 icon
Signed-off-by: bachy <git@g-u-i.net>
2012-02-04 12:20:05 +01:00
bachy 747fef9a0a added icon
Signed-off-by: bachy <git@g-u-i.net>
2012-02-04 12:19:45 +01:00
bachy 0c65f95fbb first import
Signed-off-by: bachy <git@g-u-i.net>
2012-02-04 11:55:38 +01:00
bachy 4fc8e542c3 fixed i18n_taxonomy missing
added module_exists('i18n_taxonomy')

Signed-off-by: bachy <git@g-u-i.net>
2012-02-04 11:47:59 +01:00
bachy 8690f4a165 càrrectif bug : term created even if node form validation fail
- remove taxonomy term save from tod, let taxonomy handle the term
- move all toed process from hook_node_validate to hook_node_submit
- handle node creation with hook_node_presave
- handle node update (with term form) in hook_node_submit

Signed-off-by: bachy <git@g-u-i.net>
2012-02-02 18:48:13 +01:00
bachy 26591bf350 ++
Signed-off-by: bachy <git@g-u-i.net>
2012-01-21 18:31:28 +01:00
bachy 66ff837039 RC
Signed-off-by: bachy <git@g-u-i.net>
2012-01-17 16:14:17 +01:00
bachy 40f34e2191 first import
Signed-off-by: bachy <git@g-u-i.net>
2012-01-09 11:08:29 +01:00
bachy f83a0b9aee follow simple menu maj
Signed-off-by: bachy <git@g-u-i.net>
2012-01-08 19:40:28 +01:00
bachy 626ec7eabc Parent term options
Signed-off-by: bachy <git@g-u-i.net>
2012-01-07 22:59:15 +01:00
julien c22eb6bc11 clean version 2011-11-16 14:57:44 +01:00
julien 01aecdfd57 test 2011-11-16 14:55:13 +01:00
julien d84e570b3c test 2011-11-16 14:53:39 +01:00
julien 7351bc66a0 debbug bach 2011-10-14 14:02:46 +02:00
bachy 691ecd7d61 add gui icon
Signed-off-by: bachy <git@g-u-i.net>
2011-10-04 11:37:57 +02:00
bachy 930913e764 term is saved (created) and node tagged with, but then term name will not be updated yet. module can't add term form in the node form yet.
Signed-off-by: bachy <git@g-u-i.net>
2011-09-29 20:36:46 +02:00
julien 09bea7c003 test
Signed-off-by: julien <julien@g-u-i.net>
2011-09-19 11:08:42 +02:00
julien d23f6ab12d màj test
Signed-off-by: julien <julien@g-u-i.net>
2011-09-19 11:07:08 +02:00
julien aa857c3a40 Ajout d’un thème perso.
Signed-off-by: julien <julien@g-u-i.net>
2011-09-19 10:56:34 +02:00
bachy ad30a381f9 no message 2011-08-28 11:09:59 +02:00
bachy 951be207ab add readme 2011-08-25 21:32:15 +02:00
bachy 8ec280d5fa project creation 2011-08-25 21:26:47 +02:00
AlexisWilke 072342016d Issue [#1120980] by stephen Verdant: Simplemenu missing for roles other than root administrator 2011-07-04 12:44:50 -07:00
The Great Git MigrationandDrupal Git User (LDAP) 5427717666 Removing translation directories 2011-02-25 02:07:04 +00:00
The Great Git MigrationandDrupal Git User (LDAP) a19cf5aae0 Stripping CVS keywords 2011-02-25 02:07:04 +00:00
Alexis Wilke 000cc37f2f * Port from 6.x changes. Check that $(element) is not empty to proceed. 2010-06-01 21:09:27 +00:00
Alexis Wilke 4d9851e410 First stride at getting a version 7.x working... 2010-05-31 09:44:37 +00:00
Alexis Wilke 9cdd779930 Delete simplemenu Multi-menu variables on uninstall(). 2010-05-26 06:33:32 +00:00
Alexis Wilke e3e87a93d7 * Fixed which menu is presented according to the settings (duh!) [#809546] 2010-05-26 06:10:34 +00:00
Alexis Wilke ea30728ec8 * Added a white line at the top of the drop downs. 2010-05-24 20:37:12 +00:00
Alexis Wilke 8a187e010b The multi-menu module addition 2010-05-16 23:20:33 +00:00
Alexis Wilke 03cc8469dc * Moved the multi-menu in a separate module so we don't automatically get
those features (save time for many of us!)
* Fixed the inactive parent function names
* Mark the top links with 'simplemenu_multi_menu_root'
2010-05-16 23:20:01 +00:00
Alexis Wilke 4430806082 * Fixed the Inactive Parent anchor name so they all are unique.
* Fixed the Devel menu name and identifier.
* Added support for users to select multiple menus.
2010-05-16 10:45:25 +00:00
Alexis Wilke d9f856a075 Pretty major update to better support several options:
* Added a white border at the top of the drop-downs in original
* Optimized the "view" test for simplemenu
* Enhanced the init() function by creating sub-functions and
  moving the footer functionality in it
* The list of themes is now dynamically generated from the
  simplemenu themes folder
* The list of superfish now includes a 'custom' so the code may
  come from another module or theme
* The Simplemenu variable can now be moved to the header and
  cache in its own JS file
* Create a Devel and Inactive Parents modules for additional
  functionality
* Moved the simplemenu modules in the Menu package
* Changed the function generating the menu so other modules may
  tweak the menu if so they wish
* Moved the support for Devel in a separate sub-module.
  (this is with the new way of doing things & has a corresponding
  update hook to tell users about the change. It is actually a good
  example of using the new hook system!)
2010-05-16 09:10:28 +00:00
Alexis Wilke b50c953eeb Moving Simplemenu in the Menu package with the other two new modules. 2010-05-16 09:00:07 +00:00
Alexis Wilke 5109e619cc Changes to support a fixed position (i.e. does not scroll with the page.)
Put the menu inside a <div> block (so fixed position works.)
Added support to switch between versions of superfish.
Added support for z-index parameter in admin screen.
2010-05-15 10:47:59 +00:00
Alexis Wilke d5ce155335 Small fix for I changed (fixed) the name of a variable. 2010-05-15 10:43:12 +00:00
Alexis Wilke de47d2f980 Reformatted with spaces instead of tabs as expected in Drupal.
Removed the z-index which was moved to the CSS template instead.
2010-05-15 10:42:33 +00:00
Alexis Wilke b8566401fd Reformatted with spaces as expected in Drupal 2010-05-15 10:41:35 +00:00
Alexis Wilke 8008cecb85 Created a template CSS that can be tweaked from the simplemenu administration
screen. The other CSS file is still work and used as a backup in case the
software cannot create a .css in the sites/name/files/css/... folder.
2010-05-15 10:40:53 +00:00
Alexis Wilke 2281eac5c1 Renamed the existing superfish as 1.4.1
Added superfish 1.4.8
The interface let you choose the version.
2010-05-15 10:39:43 +00:00
Alexis Wilke 202280fa6b Do not add the id="simplemenu" in JavaScript. Do it in PHP instead.
Added a new superfish parameter added in 1.4.8 (not present in 1.4.1 so it
has not side effect to the old version.)
2010-05-15 10:38:40 +00:00
Alexis Wilke c198b6f75f Fixed the description. 2010-05-15 10:36:13 +00:00
Alexis Wilke 13e221324c * Fixed the title of the simplemenu settings fieldset 2010-04-22 23:04:06 +00:00
Alexis Wilke f3409f422e * Moved a few things around in the settings screen.
* Fixed a potential problem with themes.
2010-04-21 10:32:17 +00:00
Alexis Wilke 1e627725ac * Removed the info that is to be added by Drupal automatically. 2010-04-14 09:40:29 +00:00
Alexis Wilke 18f4b720a8 * Many fixes as found in many issues.
[#565736]
  [#412500]
  [#421732]
  [#766466]
* Passed through coder (fixed tabs, missing spaces)
* Added missing hook_uninstall() function to delete variables
* Fixed some formatting in code (.module, .inc, .css, .js)
2010-04-13 01:19:04 +00:00
Roger López b21bbdb14f #350111: German Translation 6.x, by XerraX 2009-04-02 00:41:22 +00:00
Roger López 0dbc7d7df4 #390968: Use Drupal 6's JavaScript API to load the JavaScript for the module, by remi 2009-04-01 00:23:46 +00:00
Roger López b2b3f7f0b4 #405904: simple menu behind navigation 2009-04-01 00:17:17 +00:00
Roger López 5c42f3c952 #285533: The word 'false' appears in the menu, by dellis, remi, Roger Lopez 2009-04-01 00:07:16 +00:00
Roger López cc52ea5af6 #332711: Menu not displaying on certain paths caused by theme exclusions 2008-12-12 05:25:07 +00:00
Roger López a570618597 #235464: simplemenu disappears when Zen theme is turned on 2008-12-06 18:04:45 +00:00
Roger López b6333de34e #245656: Blue and Black menu doesn't look good (at least in Garland) 2008-12-06 17:35:02 +00:00
Roger López cc43fb6fa3 #336119: Problems with administration theme displaying on block admin page 2008-12-06 17:12:22 +00:00
Roger López 53a2bce0bd #296822: Add admin setting to disable menu on certain paths 2008-10-17 01:08:12 +00:00
Roger López a42aa98302 - #311977: update function 2008-10-12 23:35:48 +00:00
Roger López c98cff88e7 - #247373: found untranslatable strings, by Takafumi 2008-10-12 22:44:40 +00:00
Roger López c3abc04ce2 #309572: Code review by wmostrey
#232308: Show devel links feature
2008-10-12 22:36:56 +00:00
Takafumi d8f75a77e1 Adds Japanese translation 2008-04-16 13:08:51 +00:00
Ted Serbinski 23a553dc8b update simplemenu to 6.x, patch by starbow, ax 2008-02-28 21:47:17 +00:00
Ted Serbinski d45e0979fa - #199882, new options for controlling menu effects and timing, patch by Steve McKenzie, modified by me 2008-01-26 23:08:39 +00:00
Ted Serbinski f0db5b9d05 - #199715, remove absolute positioning to improve theme and CSS attaching compatibility 2008-01-26 22:27:42 +00:00
Ted Serbinski 2f6f865e33 - #195972, better default CSS to avoid conflicts with themes, patch by Keyz 2008-01-26 22:18:40 +00:00
Ted Serbinski ebdc82203b #200086, don't load non-existent custom.css file 2008-01-26 22:08:52 +00:00
Ted Serbinski f55e651074 #199224, patch by Darren Oh, modified by me, fix IE6/7 display issues 2008-01-26 22:04:26 +00:00
Ted Serbinski 5ef33d2fa2 fix JS parse error when compressed 2007-11-23 00:32:52 +00:00
Ted Serbinski f3935ae423 update README 2007-11-22 19:34:55 +00:00
Ted Serbinski 0dd46f5214 new black and blue theme and other CSS fixes 2007-11-22 19:26:04 +00:00
Ted Serbinski 5c6bec1d8a remove dependency on menu module 2007-11-22 18:14:34 +00:00
Ted Serbinski 67bf2e51ad #144742 - don't show A titles 2007-11-22 05:11:47 +00:00
Ted Serbinski 71f74b5565 #180106 - fix missing translatable strings 2007-11-22 05:07:07 +00:00
Ted Serbinski f9b542c391 add missing theme, fix hardcoded CSS 2007-11-22 05:03:10 +00:00
Ted Serbinski 57a7629b29 #162860 remove replace, not valid jQuery 2007-11-22 04:52:15 +00:00
Ted Serbinski ebb1ab6ce1 ability to set new themes now 2007-11-22 04:43:47 +00:00
Ted Serbinski 3d8955fb48 downgrade to superfish 1.3 so it actually works 2007-11-22 03:41:53 +00:00
Ted Serbinski 36d7d5cf37 remove RTL support, now in D6 2007-11-22 02:00:10 +00:00
Ted Serbinski 778c49b92e update to superfish 1.3.2 and latest bgiframe 2007-11-22 01:53:28 +00:00
Ted Serbinski 31259736e3 update to superfish 1.3 2007-11-22 01:38:45 +00:00
Ted Serbinski 08fe6616f9 fix parse error when using with JS aggregator 2007-07-12 02:10:46 +00:00
Derek Wright 3ce126eb48 #152819: Module .info files should not define 'version' in CVS 2007-06-18 23:07:03 +00:00
Ted Serbinski d32378cf35 fix z-index issue with themes, guarantee simplemenu to be on top, thanks Junyor 2007-04-16 06:08:40 +00:00
Ted Serbinski 2ca8cc7e56 sync info file version number 2007-04-08 04:26:45 +00:00
Ted Serbinski 53f9178ff0 re-adding missing text align 2007-04-07 06:22:55 +00:00
Ted Serbinski a5276dfe41 fix javascript chaining preventing effects 2007-04-07 05:51:57 +00:00
Ted Serbinski 21563d09ce major rewrite of menu code, tons of bug and usability fixes, faster, and better cross browser integration, and RTL support 2007-04-07 05:41:34 +00:00
Ted Serbinski 4d03934230 #132453, keep menus left justified even if the theme is centered, patch by dericknwq 2007-04-07 03:59:43 +00:00
Ted Serbinski ec97ad2402 remove AJAX callback, pass menu structure to page directly, dramatically faster, 1 less HTTP request, clear your menu cache, can produce weirdness/infinit loops 2007-04-07 03:57:43 +00:00
Ted Serbinski ccd2494fb7 #133010, fix devel links, patch by dericknwq 2007-04-07 03:30:15 +00:00
Ted Serbinski 6b915cda88 bump the revision number 2007-03-01 00:11:38 +00:00
Ted Serbinski eb09ab5342 add new RTL advanced setting for themes that need that 2007-03-01 00:08:04 +00:00
Ted Serbinski cd38617398 #116317, disable simplemenu on a per theme basis, patch by jjeff 2007-02-28 23:43:42 +00:00
Ted Serbinski 659a21255a #123486 fix typo in readme, thanks scor 2007-02-28 23:02:53 +00:00
Ted Serbinski 4687549e89 #114803, fix textareas not working, patch by quicksketch 2007-02-28 23:00:59 +00:00
Ted Serbinski ba3b8e51d1 #114107, improved interface/colors, patch by quicksketch 2007-01-30 06:02:09 +00:00
Ted Serbinski 6085946d1d #114015, advanced menu settings to place menu anywhere on page, patch by Steve McKenzie, modified by me 2007-01-30 05:41:41 +00:00
Ted Serbinski a5022b38fc bring back fixed position menu, but fix it from overlapping the theme 2007-01-30 04:57:20 +00:00
Ted Serbinski 831fbf4e0f fix page scroll down, #108655 2007-01-30 04:53:45 +00:00
Ted Serbinski 7bbcc73ae8 removing unused icon 2007-01-30 04:46:49 +00:00
Ted Serbinski 6f6aef2e67 updated theme for menu, better usability, #113203 2007-01-30 04:45:40 +00:00
Ted Serbinski cb22790246 #108971, use any menu not just root menus, patch by ewhipple 2007-01-16 06:47:15 +00:00
Ted Serbinski cca7f982e4 capitalization fix 2007-01-11 04:14:29 +00:00
Ted Serbinski 50807fe40f add version info 2007-01-11 04:03:09 +00:00
Ted Serbinski 60cc6ae1a3 renaming menu bar module to SimpleMenu module 2007-01-11 03:25:24 +00:00
Ted Serbinski 1ed6151591 smooth initial loading of menu, thanks to craq for the tip 2007-01-10 06:13:00 +00:00
Ted Serbinski 0c661bcbd4 #103381 use negative margins for menus, gets rid of horizontal scrollbar, patch by quicksketch 2007-01-10 05:42:41 +00:00
Ted Serbinski 1251927952 #108098 fix cursor being hidden in firefox, patch by quicksketch. note, the menu no longer stays on top as you scroll, however forms are usable once again. this feature will return in version 3 when it's rewritten to be 100% jQuery. 2007-01-10 05:40:31 +00:00
Ted Serbinski 5ca8a4fc6c #102423 fix anchor title from interfering with links, patch by quicksketch 2007-01-10 05:36:57 +00:00
Ted Serbinski 44e1fc9296 fix default menu size to be a bit larger 2006-11-18 01:27:40 +00:00
Ted Serbinski 24bb9a57bb fix menu capitalization to be consistent with core 2006-11-18 01:26:44 +00:00
Ted Serbinski 911791b362 fix menu paths when mod_rewrite is not available 2006-11-18 01:22:58 +00:00
Ted Serbinski 44264836be new menu bar built with jquery 2006-09-18 21:54:19 +00:00
8529 changed files with 1884688 additions and 1282 deletions
+15 -4
View File
@@ -1,13 +1,24 @@
# Ignore configuration files that may contain sensitive information.
sites/*/settings*.php
sites/*/drushrc*
# Ignore paths that contain user-generated content.
sites/*
#sites/*/files
#sites/*/private
#sites/*
sites/*/files
sites/*/private
sites/all/translations/*
_base_d7.tmproj
/_materio.sublime-project
/_materio.sublime-workspace
/_solr.sublime-project
/_solr.sublime-workspace
/_solr.sublime-workspace
*.sublime-project
*.sublime-workspace
*.sublime-project*
node_modules
.sass-cache
typescript
.directory
+1 -2
View File
@@ -107,7 +107,7 @@ DirectoryIndex index.php index.html index.htm
#
# If your site is running in a VirtualDocumentRoot at http://example.com/,
# uncomment the following line:
# RewriteBase /
RewriteBase /
# Pass all requests not referring directly to files in the filesystem to
# index.php. Clean URLs are handled in drupal_environment_initialize().
@@ -224,7 +224,6 @@ AddDefaultCharset utf-8
AddCharset utf-8 .atom .css .js .json .rss .vtt .xml
# ----------------------------------------------------------------------
# A little more security
# ----------------------------------------------------------------------
@@ -0,0 +1,73 @@
From 1f82c4ef9b474a12d160813f767128d645f524cc Mon Sep 17 00:00:00 2001
From: Bachir Soussi Chiadmi <bachir@g-u-i.me>
Date: Sun, 19 Apr 2015 21:04:36 +0200
Subject: [PATCH] repatched entityrefeerence module
---
...ityReference_SelectionHandler_Generic.class.php | 43 +++++++++++++++++++---
1 file changed, 38 insertions(+), 5 deletions(-)
diff --git a/sites/all/modules/contrib/fields/entityreference/plugins/selection/EntityReference_SelectionHandler_Generic.class.php b/sites/all/modules/contrib/fields/entityreference/plugins/selection/EntityReference_SelectionHandler_Generic.class.php
index 444a74c..660fe3d 100644
--- a/sites/all/modules/contrib/fields/entityreference/plugins/selection/EntityReference_SelectionHandler_Generic.class.php
+++ b/sites/all/modules/contrib/fields/entityreference/plugins/selection/EntityReference_SelectionHandler_Generic.class.php
@@ -370,6 +370,28 @@ class EntityReference_SelectionHandler_Generic_node extends EntityReference_Sele
* This only exists to workaround core bugs.
*/
class EntityReference_SelectionHandler_Generic_user extends EntityReference_SelectionHandler_Generic {
+
+ /**
+ * Implements EntityReferenceHandler::settingsForm().
+ */
+ public static function settingsForm($field, $instance) {
+ $settings = $field['settings']['handler_settings'];
+ $form = parent::settingsForm($field, $instance);
+ $form['referenceable_roles'] = array(
+ '#type' => 'checkboxes',
+ '#title' => t('User roles that can be referenced'),
+ '#default_value' => isset($settings['referenceable_roles']) ? array_filter($settings['referenceable_roles']) : array(),
+ '#options' => user_roles(TRUE),
+ );
+ $form['referenceable_status'] = array(
+ '#type' => 'checkboxes',
+ '#title' => t('User status that can be referenced'),
+ '#default_value' => isset($settings['referenceable_status']) ? array_filter($settings['referenceable_status']) : array('active' => 'active'),
+ '#options' => array('active' => t('Active'), 'blocked' => t('Blocked')),
+ );
+ return $form;
+ }
+
public function buildEntityFieldQuery($match = NULL, $match_operator = 'CONTAINS') {
$query = parent::buildEntityFieldQuery($match, $match_operator);
@@ -378,11 +400,22 @@ class EntityReference_SelectionHandler_Generic_user extends EntityReference_Sele
$query->propertyCondition('name', $match, $match_operator);
}
- // Adding the 'user_access' tag is sadly insufficient for users: core
- // requires us to also know about the concept of 'blocked' and
- // 'active'.
- if (!user_access('administer users')) {
- $query->propertyCondition('status', 1);
+ $field = $this->field;
+ $settings = $field['settings']['handler_settings'];
+ $referenceable_roles = isset($settings['referenceable_roles']) ? array_filter($settings['referenceable_roles']) : array();
+ $referenceable_status = isset($settings['referenceable_status']) ? array_filter($settings['referenceable_status']) : array('active' => 'active');
+
+ // If this filter is not filled, use the users access permissions.
+ if (empty($referenceable_status)) {
+ // Adding the 'user_access' tag is sadly insufficient for users: core
+ // requires us to also know about the concept of 'blocked' and 'active'.
+ if (!user_access('administer users')) {
+ $query->propertyCondition('status', 1);
+ }
+ }
+ elseif (count($referenceable_status) == 1) {
+ $values = array('active' => 1, 'blocked' => 0);
+ $query->propertyCondition('status', $values[key($referenceable_status)]);
}
return $query;
}
--
2.3.5
+25
View File
@@ -0,0 +1,25 @@
From 7becdeff922748fb65a320903b0ee37268895dd1 Mon Sep 17 00:00:00 2001
From: Bachir Soussi Chiadmi <bachir@g-u-i.me>
Date: Sun, 19 Apr 2015 21:13:38 +0200
Subject: [PATCH] repatched views module
---
sites/all/modules/contrib/views/views/handlers/views_handler_field.inc | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sites/all/modules/contrib/views/views/handlers/views_handler_field.inc b/sites/all/modules/contrib/views/views/handlers/views_handler_field.inc
index 65210d9..c04fd46 100644
--- a/sites/all/modules/contrib/views/views/handlers/views_handler_field.inc
+++ b/sites/all/modules/contrib/views/views/handlers/views_handler_field.inc
@@ -372,7 +372,7 @@ class views_handler_field extends views_handler {
* Optional name of the field where the value is stored.
*/
function get_value($values, $field = NULL) {
- $alias = isset($field) ? $this->aliases[$field] : $this->field_alias;
+ $alias = isset($field) && isset($this->aliases[$field]) ? $this->aliases[$field] : $this->field_alias;
if (isset($values->{$alias})) {
return $values->{$alias};
}
--
2.3.5
@@ -1,11 +1,11 @@
diff --git a/modules/user/user.module b/modules/user/user.module
index 47ac642..c204f6d 100644
index bdfd36f..d33a528 100644
--- a/modules/user/user.module
+++ b/modules/user/user.module
@@ -2286,14 +2286,26 @@ function user_external_login_register($name, $module) {
*
* @param object $account
* An object containing the user account.
@@ -2328,14 +2328,26 @@ function user_external_login_register($name, $module) {
* following properties:
* - uid: The user ID number.
* - login: The UNIX timestamp of the user's last login.
+ * @param array $options
+ * (optional) A keyed array of settings. Supported options are:
+ * - langcode: A language code to be used when generating locale-sensitive
@@ -18,7 +18,7 @@ index 47ac642..c204f6d 100644
-function user_pass_reset_url($account) {
+function user_pass_reset_url($account, $options = array()) {
$timestamp = REQUEST_TIME;
- return url("user/reset/$account->uid/$timestamp/" . user_pass_rehash($account->pass, $timestamp, $account->login), array('absolute' => TRUE));
- return url("user/reset/$account->uid/$timestamp/" . user_pass_rehash($account->pass, $timestamp, $account->login, $account->uid), array('absolute' => TRUE));
+ $url_options = array('absolute' => TRUE);
+ if (isset($options['langcode'])) {
+ $languages = language_list();
@@ -27,29 +27,29 @@ index 47ac642..c204f6d 100644
+ else {
+ $url_options['language'] = user_preferred_language($account);
+ }
+ return url("user/reset/$account->uid/$timestamp/" . user_pass_rehash($account->pass, $timestamp, $account->login), $url_options);
+ return url("user/reset/$account->uid/$timestamp/" . user_pass_rehash($account->pass, $timestamp, $account->login, $account->uid), $url_options);
}
/**
@@ -2305,6 +2317,10 @@ function user_pass_reset_url($account) {
* - uid: The user uid number.
@@ -2347,6 +2359,10 @@ function user_pass_reset_url($account) {
* - uid: The user ID number.
* - pass: The hashed user password string.
* - login: The user login name.
* - login: The UNIX timestamp of the user's last login.
+ * @param array $options
+ * (optional) A keyed array of settings. Supported options are:
+ * - langcode: A language code to be used when generating locale-sensitive
+ * urls. If langcode is NULL the users preferred language is used.
+ * urls. If langcode is NULL the users preferred language is used.
*
* @return
* A unique URL that may be used to confirm the cancellation of the user
@@ -2313,9 +2329,17 @@ function user_pass_reset_url($account) {
@@ -2355,9 +2371,17 @@ function user_pass_reset_url($account) {
* @see user_mail_tokens()
* @see user_cancel_confirm()
*/
-function user_cancel_url($account) {
+function user_cancel_url($account, $options = array()) {
$timestamp = REQUEST_TIME;
- return url("user/$account->uid/cancel/confirm/$timestamp/" . user_pass_rehash($account->pass, $timestamp, $account->login), array('absolute' => TRUE));
- return url("user/$account->uid/cancel/confirm/$timestamp/" . user_pass_rehash($account->pass, $timestamp, $account->login, $account->uid), array('absolute' => TRUE));
+ $url_options = array('absolute' => TRUE);
+ if (isset($options['langcode'])) {
+ $languages = language_list();
@@ -58,20 +58,20 @@ index 47ac642..c204f6d 100644
+ else {
+ $url_options['language'] = user_preferred_language($account);
+ }
+ return url("user/$account->uid/cancel/confirm/$timestamp/" . user_pass_rehash($account->pass, $timestamp, $account->login), $url_options);
+ return url("user/$account->uid/cancel/confirm/$timestamp/" . user_pass_rehash($account->pass, $timestamp, $account->login, $account->uid), $url_options);
}
/**
@@ -2752,7 +2776,7 @@ Your account on [site:name] has been canceled.
@@ -2843,7 +2867,7 @@ Your account on [site:name] has been canceled.
if ($replace) {
// We do not sanitize the token replacement, since the output of this
// replacement is intended for an e-mail message, not a web browser.
- return token_replace($text, $variables, array('language' => $language, 'callback' => 'user_mail_tokens', 'sanitize' => FALSE, 'clear' => TRUE));
+ return token_replace($text, $variables, array('langcode' => $langcode, 'callback' => 'user_mail_tokens', 'sanitize' => FALSE, 'clear' => TRUE));
+ return token_replace($text, $variables, array('language' => $language, 'langcode' => $langcode, 'callback' => 'user_mail_tokens', 'sanitize' => FALSE, 'clear' => TRUE));
}
return $text;
@@ -2779,8 +2803,8 @@ Your account on [site:name] has been canceled.
@@ -2870,8 +2894,8 @@ Your account on [site:name] has been canceled.
*/
function user_mail_tokens(&$replacements, $data, $options) {
if (isset($data['user'])) {
@@ -83,10 +83,10 @@ index 47ac642..c204f6d 100644
}
diff --git a/modules/user/user.test b/modules/user/user.test
index b53db07..0417642 100644
index 07be4c2..4536e0c 100644
--- a/modules/user/user.test
+++ b/modules/user/user.test
@@ -2012,6 +2012,26 @@ class UserTokenReplaceTestCase extends DrupalWebTestCase {
@@ -2145,6 +2145,26 @@ class UserTokenReplaceTestCase extends DrupalWebTestCase {
);
}
@@ -113,9 +113,9 @@ index b53db07..0417642 100644
/**
* Creates a user, then tests the tokens generated from it.
*/
@@ -2062,6 +2082,39 @@ class UserTokenReplaceTestCase extends DrupalWebTestCase {
@@ -2195,6 +2215,39 @@ class UserTokenReplaceTestCase extends DrupalWebTestCase {
$output = token_replace($input, array('user' => $account), array('language' => $language, 'sanitize' => FALSE));
$this->assertEqual($output, $expected, t('Unsanitized user token %token replaced.', array('%token' => $input)));
$this->assertEqual($output, $expected, format_string('Unsanitized user token %token replaced.', array('%token' => $input)));
}
+
+ $languages = language_list();
-30
View File
@@ -1,30 +0,0 @@
diff --git a/misc/autocomplete.js b/misc/autocomplete.js
index 8f7ac60..5679081 100644
--- a/misc/autocomplete.js
+++ b/misc/autocomplete.js
@@ -114,6 +114,7 @@ Drupal.jsAC.prototype.onkeyup = function (input, e) {
*/
Drupal.jsAC.prototype.select = function (node) {
this.input.value = $(node).data('autocompleteValue');
+ $(this.input).trigger('autocompleteSelect', [node]);
};
/**
@@ -167,7 +168,7 @@ Drupal.jsAC.prototype.unhighlight = function (node) {
Drupal.jsAC.prototype.hidePopup = function (keycode) {
// Select item if the right key or mousebutton was pressed.
if (this.selected && ((keycode && keycode != 46 && keycode != 8 && keycode != 27) || !keycode)) {
- this.input.value = $(this.selected).data('autocompleteValue');
+ this.select(this.selected);
}
// Hide popup.
var popup = this.popup;
@@ -220,7 +221,7 @@ Drupal.jsAC.prototype.found = function (matches) {
for (key in matches) {
$('<li></li>')
.html($('<div></div>').html(matches[key]))
- .mousedown(function () { ac.select(this); })
+ .mousedown(function () { ac.hidePopup(this); })
.mouseover(function () { ac.highlight(this); })
.mouseout(function () { ac.unhighlight(this); })
.data('autocompleteValue', key)
+182
View File
@@ -1,4 +1,186 @@
Drupal 7.39, 2015-08-19
-----------------------
- Fixed security issues (multiple vulnerabilities). See SA-CORE-2015-003.
Drupal 7.38, 2015-06-17
-----------------------
- Fixed security issues (multiple vulnerabilities). See SA-CORE-2015-002.
Drupal 7.37, 2015-05-07
-----------------------
- Fixed a regression in Drupal 7.36 which caused certain kinds of content types
to become disabled if they were defined by a no-longer-enabled module.
- Removed a confusing description regarding automatic time zone detection from
the user account form (minor UI and data structure change).
- Allowed custom HTML tags with a dash in the name to pass through filter_xss()
when specified in the list of allowed tags.
- Allowed hook_field_schema() implementations to specify indexes for fields
based on a fixed-length column prefix (rather than the entire column), as was
already allowed in hook_schema() implementations.
- Fixed PDO exceptions on PostgreSQL when accessing invalid entity URLs.
- Added a sites/all/libraries folder to the codebase, with instructions for
using it.
- Added a description to the "Administer text formats and filters" permission
on the Permissions page (string change).
- Numerous small bug fixes.
- Numerous API documentation improvements.
- Additional automated test coverage.
Drupal 7.36, 2015-04-01
-----------------------
- Added a 'file_public_schema' variable which allows modules that define
publicly-accessible streams in hook_stream_wrappers() to bypass file download
access checks when processing managed file upload fields.
- Fixed a bug that caused database query tags not to be added to search-related
database queries under many circumstances, and which prevented the
corresponding hook_query_TAG_alter() implementations from being called.
- Fixed the "for" attribute on managed file upload field labels to improve
accessibility (minor markup change).
- Added a 'javascript_always_use_jquery' variable which can be set to FALSE by
sites that may not need jQuery loaded on all pages, and a 'requires_jquery'
option to drupal_add_js() which modules can set to FALSE when adding
JavaScript files that have no dependency on jQuery (API addition:
https://www.drupal.org/node/2462717).
- Fixed incorrect foreign keys in the User module's role_permission and
users_roles database tables.
- Changed permission descriptions throughout Drupal core to consistently link
to relevant administrative pages, regardless of whether the user viewing the
Permissions page can view the page being linked to (minor UI change).
- Fixed the drupal_add_region_content() function so that it actually adds
content to the page.
- Added an 'image_suppress_itok_output' variable to allow sites already using
the existing 'image_allow_insecure_derivatives' variable to also prevent
security tokens from appearing in image derivative URLs.
- Fixed double-escaping of theme names in the Block module administrative
interface (minor string change).
- Added basic support for Xdebug when running automated tests.
- Fixed a bug which caused previewing a node to remove elements from the node
being edited. With this fix, calling node_preview() will no longer modify the
passed-in node object (minor API change).
- Added a user_has_role() function to check whether a user has a particular
role (API addition: https://www.drupal.org/node/2462411).
- Fixed installation failures when an opcode cache is enabled.
- Fixed a bug in the Drupal 6 to Drupal 7 upgrade path which caused private
files to be inaccessible.
- Fixed a bug in the Drupal 6 to Drupal 7 upgrade path which caused user
pictures to be lost.
- Fixed missing language code in hook_field_attach_view_alter() when it is
invoked from field_view_field().
- Stopped sending ETag and Last-Modified headers for uncached page requests,
since they break caching for certain Varnish and Nginx configurations.
- Changed the Simpletest module to allow PSR-4 test classes to be used in
Drupal 7.
- Fixed a fatal error that occurred when using the Comment module's "Unpublish
comment containing keyword(s)" action.
- Changed the "lang" attribute on language links to "xml:lang" so it validates
as XHTML (minor markup change).
- Prevented the form API from allowing arrays to be submitted for various form
elements, such as textfields, textareas, and password fields (API change:
https://www.drupal.org/node/2462723).
- Fixed a bug in the Contact module which caused the global user object to have
the incorrect name and e-mail address during the remainder of the page
request after the contact form is submitted.
- Numerous small bug fixes.
- Numerous API documentation improvements.
- Additional automated test coverage.
Drupal 7.35, 2015-03-18
----------------------
- Fixed security issues (multiple vulnerabilities). See SA-CORE-2015-001.
Drupal 7.34, 2014-11-19
----------------------
- Fixed security issues (multiple vulnerabilities). See SA-CORE-2014-006.
Drupal 7.33, 2014-11-07
-----------------------
- Began storing the file modification time of each module and theme in the
{system} database table so that contributed modules can use it to identify
recently changed modules and themes (minor data structure change to the
return value of system_get_info() and other related functions).
- Added a "Did you mean?" feature to the run-tests.sh script for running
automated tests from the command line, to help developers who are attempting
to run a particular test class or group.
- Changed the date format used in various HTTP headers output by Drupal core
from RFC 1123 format to RFC 7231 format.
- Added a "block_cache_bypass_node_grants" variable to allow sites which have
node access modules enabled to use the block cache if desired (API addition).
- Made image derivative generation HTTP requests return a 404 error (rather
than a 500 error) when the source image does not exist.
- Fixed a bug which caused user pictures to be removed from the user object
after saving, and resulted in data loss if the user account was subsequently
re-saved.
- Fixed a bug in which field_has_data() did not return TRUE for fields that
only had data in older entity revisions, leading to loss of the field's data
when the field configuration was edited.
- Fixed a bug which caused the Ajax progress throbber to appear misaligned in
many situatons (minor styling change).
- Prevented the Bartik theme from lower-casing the "Permalink" link on
comments, for improved multilingual support (minor UI change).
- Added a "preferred_menu_links" tag to the database query that is used by
menu_link_get_preferred() to find the preferred menu link for a given path,
to make it easier to alter.
- Increased the maximum allowed length of block titles to 255 characters
(database schema change to the {block} table).
- Removed the Field module's field_modules_uninstalled() function, since it did
not do anything when it was invoked.
- Added a "theme_hook_original" variable to templates and theme functions and
an optional sitewide theme debug mode, to provide contextual information in
the page's HTML to theme developers. The theme debug mode is based on the one
used with Twig in Drupal 8 and can be accessed by setting the "theme_debug"
variable to TRUE (API addition).
- Added an entity_view_mode_prepare() API function to allow entity-defining
modules to properly invoke hook_entity_view_mode_alter(), and used it
throughout Drupal core to fix bugs with the invocation of that hook (API
change: https://www.drupal.org/node/2369141).
- Security improvement: Made the database API's orderBy() method sanitize the
sort direction ("ASC" or "DESC") for queries built with db_select(), so that
calling code does not have to.
- Changed the RDF module to consistently output RDF metadata for nodes and
comments near where the node is rendered in the HTML (minor markup and data
structure change).
- Added an HTML class to RDFa metatags throughout Drupal to prevent them from
accidentally affecting the site appearance (minor markup change).
- Fixed a bug in the Unicode requirements check which prevented installing
Drupal on PHP 5.6.
- Fixed a bug which caused drupal_get_bootstrap_phase() to abort the bootstrap
when called early in the page request.
- Renamed the "Search result" view mode to "Search result highlighting input"
to better reflect how it is used (UI change).
- Improved database queries generated by EntityFieldQuery in the case where
delta or language condition groups are used, to reduce the number of INNER
JOINs (this is a minor data structure change affecting code which implements
hook_query_alter() on these queries).
- Removed special-case behavior for file uploads which allowed user #1 to
bypass maximum file size and user quota limits.
- Numerous small bug fixes.
- Numerous API documentation improvements.
- Additional automated test coverage.
Drupal 7.32, 2014-10-15
----------------------
- Fixed security issues (SQL injection). See SA-CORE-2014-005.
Drupal 7.31, 2014-08-06
----------------------
- Fixed security issues (denial of service). See SA-CORE-2014-004.
Drupal 7.30, 2014-07-24
-----------------------
- Fixed a regression introduced in Drupal 7.29 that caused files or images
attached to taxonomy terms to be deleted when the taxonomy term was edited
and resaved (and other related bugs with contributed and custom modules).
- Added a warning on the permissions page to recommend restricting access to
the "View site reports" permission to trusted administrators. See
DRUPAL-PSA-2014-002.
- Numerous API documentation improvements.
- Additional automated test coverage.
Drupal 7.29, 2014-07-16
----------------------
- Fixed security issues (multiple vulnerabilities). See SA-CORE-2014-003.
Drupal 7.28, 2014-05-08
-----------------------
- Fixed a regression introduced in Drupal 7.27 that caused JavaScript to break
Executable → Regular
View File
+14 -10
View File
@@ -27,7 +27,6 @@ Ajax system
- Earl Miles 'merlinofchaos' http://drupal.org/user/26979
Base system
- Károly Négyesi 'chx' http://drupal.org/user/9446
- Damien Tournoud 'DamZ' http://drupal.org/user/22211
- Moshe Weitzman 'moshe weitzman' http://drupal.org/user/23
@@ -39,7 +38,6 @@ Cache system
- Nathaniel Catchpole 'catch' http://drupal.org/user/35733
Cron system
- Károly Négyesi 'chx' http://drupal.org/user/9446
- Derek Wright 'dww' http://drupal.org/user/46549
Database system
@@ -55,10 +53,8 @@ Database system
- Sqlite driver
- Damien Tournoud 'DamZ' http://drupal.org/user/22211
- Károly Négyesi 'chx' http://drupal.org/user/9446
Database update system
- Károly Négyesi 'chx' http://drupal.org/user/9446
- Ashok Modi 'BTMash' http://drupal.org/user/60422
Entity system
@@ -71,7 +67,6 @@ File system
- Aaron Winborn 'aaron' http://drupal.org/user/33420
Form system
- Károly Négyesi 'chx' http://drupal.org/user/9446
- Alex Bronstein 'effulgentsia' http://drupal.org/user/78040
- Wolfgang Ziegler 'fago' http://drupal.org/user/16747
- Daniel F. Kudwien 'sun' http://drupal.org/user/54136
@@ -105,7 +100,6 @@ Markup
Menu system
- Peter Wolanin 'pwolanin' http://drupal.org/user/49851
- Károly Négyesi 'chx' http://drupal.org/user/9446
Path system
- Dave Reid 'davereid' http://drupal.org/user/53892
@@ -139,9 +133,6 @@ Accessibility
Documentation
- Jennifer Hodgdon 'jhodgdon' http://drupal.org/user/155601
Security
- Greg Knaddison 'greggles' http://drupal.org/user/36762
Translations
- Gerhard Killesreiter 'killes' http://drupal.org/user/83
@@ -154,6 +145,20 @@ Node Access
- Ken Rickard 'agentrickard' http://drupal.org/user/20975
- Jess Myrbo 'xjm' http://drupal.org/user/65776
Security team
-----------------
To report a security issue, see: https://drupal.org/security-team/report-issue
The Drupal security team provides Security Advisories for vulnerabilities,
assists developers in resolving security issues, and provides security
documentation. See http://drupal.org/security-team for more information. The
security team lead is:
- Michael Hess 'mlhess' https://drupal.org/user/102818
Module maintainers
------------------
@@ -250,7 +255,6 @@ Shortcut module
Simpletest module
- Jimmy Berry 'boombatower' http://drupal.org/user/214218
- Károly Négyesi 'chx' http://drupal.org/user/9446
Statistics module
- Tim Millwood 'timmillwood' http://drupal.org/user/227849
+30
View File
@@ -0,0 +1,30 @@
# Core Patches :
- Implement language aware tokens for one time login link and cancel link
https://www.drupal.org/node/1754162
- est-ce que je dois faire ce patch ???
includes/entity.inc
see https://www.drupal.org/node/1003788
# Modules :
cer
contentadminrelink
entity_translation_search_api
entityreference
feedback
//field_group
filter_path_alias
flag_lists
//nodeformcols
search_api
search_api_page
search_api_solr
termreferencetree
views
wysiwyg
views_rss_media
node_export :
- https://www.drupal.org/node/1869918
- https://www.drupal.org/node/1911638
+62 -4
View File
@@ -211,7 +211,7 @@
*
* When returning an Ajax command array, it is often useful to have
* status messages rendered along with other tasks in the command array.
* In that case the the Ajax commands array may be constructed like this:
* In that case the Ajax commands array may be constructed like this:
* @code
* $commands = array();
* $commands[] = ajax_command_replace(NULL, $output);
@@ -230,6 +230,10 @@
* functions.
*/
function ajax_render($commands = array()) {
// Although ajax_deliver() does this, some contributed and custom modules
// render Ajax responses without using that delivery callback.
ajax_set_verification_header();
// Ajax responses aren't rendered with html.tpl.php, so we have to call
// drupal_get_css() and drupal_get_js() here, in order to have new files added
// during this request to be loaded by the page. We only want to send back
@@ -276,7 +280,7 @@ function ajax_render($commands = array()) {
$extra_commands = array();
if (!empty($styles)) {
$extra_commands[] = ajax_command_prepend('head', $styles);
$extra_commands[] = ajax_command_add_css($styles);
}
if (!empty($scripts_header)) {
$extra_commands[] = ajax_command_prepend('head', $scripts_header);
@@ -292,7 +296,7 @@ function ajax_render($commands = array()) {
$scripts = drupal_add_js();
if (!empty($scripts['settings'])) {
$settings = $scripts['settings'];
array_unshift($commands, ajax_command_settings(call_user_func_array('array_merge_recursive', $settings['data']), TRUE));
array_unshift($commands, ajax_command_settings(drupal_array_merge_deep_array($settings['data']), TRUE));
}
// Allow modules to alter any Ajax response.
@@ -487,6 +491,9 @@ function ajax_deliver($page_callback_result) {
}
}
// Let ajax.js know that this response is safe to process.
ajax_set_verification_header();
// Print the response.
$commands = ajax_prepare_response($page_callback_result);
$json = ajax_render($commands);
@@ -576,6 +583,29 @@ function ajax_prepare_response($page_callback_result) {
return $commands;
}
/**
* Sets a response header for ajax.js to trust the response body.
*
* It is not safe to invoke Ajax commands within user-uploaded files, so this
* header protects against those being invoked.
*
* @see Drupal.ajax.options.success()
*/
function ajax_set_verification_header() {
$added = &drupal_static(__FUNCTION__);
// User-uploaded files cannot set any response headers, so a custom header is
// used to indicate to ajax.js that this response is safe. Note that most
// Ajax requests bound using the Form API will be protected by having the URL
// flagged as trusted in Drupal.settings, so this header is used only for
// things like custom markup that gets Ajax behaviors attached.
if (empty($added)) {
drupal_add_http_header('X-Drupal-Ajax-Token', '1');
// Avoid sending the header twice.
$added = TRUE;
}
}
/**
* Performs end-of-Ajax-request tasks.
*
@@ -764,7 +794,12 @@ function ajax_pre_render_element($element) {
$element['#attached']['js'][] = array(
'type' => 'setting',
'data' => array('ajax' => array($element['#id'] => $settings)),
'data' => array(
'ajax' => array($element['#id'] => $settings),
'urlIsAjaxTrusted' => array(
$settings['url'] => TRUE,
),
),
);
// Indicate that Ajax processing was successful.
@@ -1257,3 +1292,26 @@ function ajax_command_update_build_id($form) {
'new' => $form['#build_id'],
);
}
/**
* Creates a Drupal Ajax 'add_css' command.
*
* This method will add css via ajax in a cross-browser compatible way.
*
* This command is implemented by Drupal.ajax.prototype.commands.add_css()
* defined in misc/ajax.js.
*
* @param $styles
* A string that contains the styles to be added.
*
* @return
* An array suitable for use with the ajax_render() function.
*
* @see misc/ajax.js
*/
function ajax_command_add_css($styles) {
return array(
'command' => 'add_css',
'data' => $styles,
);
}
+107 -51
View File
@@ -8,7 +8,7 @@
/**
* The current system version.
*/
define('VERSION', '7.28');
define('VERSION', '7.39');
/**
* Core API compatibility.
@@ -248,6 +248,15 @@ define('REGISTRY_WRITE_LOOKUP_CACHE', 2);
*/
define('DRUPAL_PHP_FUNCTION_PATTERN', '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*');
/**
* A RFC7231 Compliant date.
*
* http://tools.ietf.org/html/rfc7231#section-7.1.1.1
*
* Example: Sun, 06 Nov 1994 08:49:37 GMT
*/
define('DATE_RFC7231', 'D, d M Y H:i:s \G\M\T');
/**
* Provides a caching wrapper to be used in place of large array structures.
*
@@ -520,9 +529,8 @@ function timer_stop($name) {
* Returns the appropriate configuration directory.
*
* Returns the configuration path based on the site's hostname, port, and
* pathname. Uses find_conf_path() to find the current configuration directory.
* See default.settings.php for examples on how the URL is converted to a
* directory.
* pathname. See default.settings.php for examples on how the URL is converted
* to a directory.
*
* @param bool $require_settings
* Only configuration directories with an existing settings.php file
@@ -700,7 +708,14 @@ function drupal_environment_initialize() {
* TRUE if only containing valid characters, or FALSE otherwise.
*/
function drupal_valid_http_host($host) {
return preg_match('/^\[?(?:[a-zA-Z0-9-:\]_]+\.?)+$/', $host);
// Limit the length of the host name to 1000 bytes to prevent DoS attacks with
// long host names.
return strlen($host) <= 1000
// Limit the number of subdomains and port separators to prevent DoS attacks
// in conf_path().
&& substr_count($host, '.') <= 100
&& substr_count($host, ':') <= 100
&& preg_match('/^\[?(?:[a-zA-Z0-9-:\]_]+\.?)+$/', $host);
}
/**
@@ -845,7 +860,7 @@ function drupal_get_filename($type, $name, $filename = NULL) {
try {
if (function_exists('db_query')) {
$file = db_query("SELECT filename FROM {system} WHERE name = :name AND type = :type", array(':name' => $name, ':type' => $type))->fetchField();
if (file_exists(DRUPAL_ROOT . '/' . $file)) {
if ($file !== FALSE && file_exists(DRUPAL_ROOT . '/' . $file)) {
$files[$type][$name] = $file;
}
}
@@ -1230,23 +1245,10 @@ function drupal_send_headers($default_headers = array(), $only_default = FALSE)
* fresh page on every request. This prevents authenticated users from seeing
* locally cached pages.
*
* Also give each page a unique ETag. This will force clients to include both
* an If-Modified-Since header and an If-None-Match header when doing
* conditional requests for the page (required by RFC 2616, section 13.3.4),
* making the validation more robust. This is a workaround for a bug in Mozilla
* Firefox that is triggered when Drupal's caching is enabled and the user
* accesses Drupal via an HTTP proxy (see
* https://bugzilla.mozilla.org/show_bug.cgi?id=269303): When an authenticated
* user requests a page, and then logs out and requests the same page again,
* Firefox may send a conditional request based on the page that was cached
* locally when the user was logged in. If this page did not have an ETag
* header, the request only contains an If-Modified-Since header. The date will
* be recent, because with authenticated users the Last-Modified header always
* refers to the time of the request. If the user accesses Drupal via a proxy
* server, and the proxy already has a cached copy of the anonymous page with an
* older Last-Modified date, the proxy may respond with 304 Not Modified, making
* the client think that the anonymous and authenticated pageviews are
* identical.
* ETag and Last-Modified headers are not set per default for authenticated
* users so that browsers do not send If-Modified-Since headers from
* authenticated user pages. drupal_serve_page_from_cache() will set appropriate
* ETag and Last-Modified headers for cached pages.
*
* @see drupal_page_set_cache()
*/
@@ -1259,9 +1261,7 @@ function drupal_page_header() {
$default_headers = array(
'Expires' => 'Sun, 19 Nov 1978 05:00:00 GMT',
'Last-Modified' => gmdate(DATE_RFC1123, REQUEST_TIME),
'Cache-Control' => 'no-cache, must-revalidate, post-check=0, pre-check=0',
'ETag' => '"' . REQUEST_TIME . '"',
);
drupal_send_headers($default_headers);
}
@@ -1329,7 +1329,7 @@ function drupal_serve_page_from_cache(stdClass $cache) {
drupal_add_http_header($name, $value);
}
$default_headers['Last-Modified'] = gmdate(DATE_RFC1123, $cache->created);
$default_headers['Last-Modified'] = gmdate(DATE_RFC7231, $cache->created);
// HTTP/1.0 proxies does not support the Vary header, so prevent any caching
// by sending an Expires date in the past. HTTP/1.1 clients ignores the
@@ -1552,12 +1552,13 @@ function format_string($string, array $args = array()) {
* Also validates strings as UTF-8 to prevent cross site scripting attacks on
* Internet Explorer 6.
*
* @param $text
* @param string $text
* The text to be checked or processed.
*
* @return
* An HTML safe version of $text, or an empty string if $text is not
* valid UTF-8.
* @return string
* An HTML safe version of $text. If $text is not valid UTF-8, an empty string
* is returned and, on PHP < 5.4, a warning may be issued depending on server
* configuration (see @link https://bugs.php.net/bug.php?id=47494 @endlink).
*
* @see drupal_validate_utf8()
* @ingroup sanitization
@@ -1642,14 +1643,14 @@ function request_uri() {
* information about the passed-in exception is used.
* @param $variables
* Array of variables to replace in the message on display. Defaults to the
* return value of drupal_decode_exception().
* return value of _drupal_decode_exception().
* @param $severity
* The severity of the message, as per RFC 3164.
* @param $link
* A link to associate with the message.
*
* @see watchdog()
* @see drupal_decode_exception()
* @see _drupal_decode_exception()
*/
function watchdog_exception($type, Exception $exception, $message = NULL, $variables = array(), $severity = WATCHDOG_ERROR, $link = NULL) {
@@ -2169,7 +2170,7 @@ function drupal_anonymous_user() {
* drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
* @endcode
*
* @param $phase
* @param int $phase
* A constant telling which phase to bootstrap to. When you bootstrap to a
* particular phase, all earlier phases are run automatically. Possible
* values:
@@ -2182,11 +2183,11 @@ function drupal_anonymous_user() {
* - DRUPAL_BOOTSTRAP_LANGUAGE: Finds out the language of the page.
* - DRUPAL_BOOTSTRAP_FULL: Fully loads Drupal. Validates and fixes input
* data.
* @param $new_phase
* @param boolean $new_phase
* A boolean, set to FALSE if calling drupal_bootstrap from inside a
* function called from drupal_bootstrap (recursion).
*
* @return
* @return int
* The most recently completed phase.
*/
function drupal_bootstrap($phase = NULL, $new_phase = TRUE) {
@@ -2208,12 +2209,13 @@ function drupal_bootstrap($phase = NULL, $new_phase = TRUE) {
// bootstrap state.
static $stored_phase = -1;
// When not recursing, store the phase name so it's not forgotten while
// recursing.
if ($new_phase) {
$final_phase = $phase;
}
if (isset($phase)) {
// When not recursing, store the phase name so it's not forgotten while
// recursing but take care of not going backwards.
if ($new_phase && $phase >= $stored_phase) {
$final_phase = $phase;
}
// Call a phase if it has not been called before and is below the requested
// phase.
while ($phases && $phase > $stored_phase && $final_phase > $stored_phase) {
@@ -2479,6 +2481,26 @@ function _drupal_bootstrap_variables() {
// Load bootstrap modules.
require_once DRUPAL_ROOT . '/includes/module.inc';
module_load_all(TRUE);
// Sanitize the destination parameter (which is often used for redirects) to
// prevent open redirect attacks leading to other domains. Sanitize both
// $_GET['destination'] and $_REQUEST['destination'] to protect code that
// relies on either, but do not sanitize $_POST to avoid interfering with
// unrelated form submissions. The sanitization happens here because
// url_is_external() requires the variable system to be available.
if (isset($_GET['destination']) || isset($_REQUEST['destination'])) {
require_once DRUPAL_ROOT . '/includes/common.inc';
// If the destination is an external URL, remove it.
if (isset($_GET['destination']) && url_is_external($_GET['destination'])) {
unset($_GET['destination']);
unset($_REQUEST['destination']);
}
// If there's still something in $_REQUEST['destination'] that didn't come
// from $_GET, check it too.
if (isset($_REQUEST['destination']) && (!isset($_GET['destination']) || $_REQUEST['destination'] != $_GET['destination']) && url_is_external($_REQUEST['destination'])) {
unset($_REQUEST['destination']);
}
}
}
/**
@@ -2501,7 +2523,7 @@ function _drupal_bootstrap_page_header() {
* @see drupal_bootstrap()
*/
function drupal_get_bootstrap_phase() {
return drupal_bootstrap();
return drupal_bootstrap(NULL, FALSE);
}
/**
@@ -2615,7 +2637,7 @@ function drupal_installation_attempted() {
*
* This would include implementations of hook_install(), which could run
* during the Drupal installation phase, and might also be run during
* non-installation time, such as while installing the module from the the
* non-installation time, such as while installing the module from the
* module administration page.
*
* Example usage:
@@ -3144,10 +3166,13 @@ function _registry_check_code($type, $name = NULL) {
// This function may get called when the default database is not active, but
// there is no reason we'd ever want to not use the default database for
// this query.
$file = Database::getConnection('default', 'default')->query("SELECT filename FROM {registry} WHERE name = :name AND type = :type", array(
':name' => $name,
':type' => $type,
))
$file = Database::getConnection('default', 'default')
->select('registry', 'r', array('target' => 'default'))
->fields('r', array('filename'))
// Use LIKE here to make the query case-insensitive.
->condition('r.name', db_like($name), 'LIKE')
->condition('r.type', $type)
->execute()
->fetchField();
// Flag that we've run a lookup query and need to update the cache.
@@ -3321,11 +3346,9 @@ function registry_update() {
* @param $default_value
* Optional default value.
* @param $reset
* TRUE to reset a specific named variable, or all variables if $name is NULL.
* Resetting every variable should only be used, for example, for running
* unit tests with a clean environment. Should be used only though via
* function drupal_static_reset() and the return value should not be used in
* this case.
* TRUE to reset one or all variables(s). This parameter is only used
* internally and should not be passed in; use drupal_static_reset() instead.
* (This function's return value should not be used when TRUE is passed in.)
*
* @return
* Returns a variable by reference.
@@ -3370,6 +3393,8 @@ function &drupal_static($name, $default_value = NULL, $reset = FALSE) {
*
* @param $name
* Name of the static variable to reset. Omit to reset all variables.
* Resetting all variables should only be used, for example, for running unit
* tests with a clean environment.
*/
function drupal_static_reset($name = NULL) {
drupal_static($name, NULL, TRUE);
@@ -3485,3 +3510,34 @@ function drupal_check_memory_limit($required, $memory_limit = NULL) {
// - The memory limit is greater than the memory required for the operation.
return ((!$memory_limit) || ($memory_limit == -1) || (parse_size($memory_limit) >= parse_size($required)));
}
/**
* Invalidates a PHP file from any active opcode caches.
*
* If the opcode cache does not support the invalidation of individual files,
* the entire cache will be flushed.
*
* @param string $filepath
* The absolute path of the PHP file to invalidate.
*/
function drupal_clear_opcode_cache($filepath) {
if (!defined('PHP_VERSION_ID') || PHP_VERSION_ID < 50300) {
// Below PHP 5.3, clearstatcache does not accept any function parameters.
clearstatcache();
}
else {
clearstatcache(TRUE, $filepath);
}
// Zend OPcache.
if (function_exists('opcache_invalidate')) {
opcache_invalidate($filepath, TRUE);
}
// APC.
if (function_exists('apc_delete_file')) {
// apc_delete_file() throws a PHP warning in case the specified file was
// not compiled yet.
// @see http://php.net/apc-delete-file
@apc_delete_file($filepath);
}
}
+10 -6
View File
@@ -98,9 +98,11 @@ function cache_get_multiple(array &$cids, $bin = 'cache') {
* @param $data
* The data to store in the cache. Complex data types will be automatically
* serialized before insertion. Strings will be stored as plain text and are
* not serialized.
* not serialized. Some storage engines only allow objects up to a maximum of
* 1MB in size to be stored by default. When caching large arrays or similar,
* take care to ensure $data does not exceed this size.
* @param $bin
* The cache bin to store the data in. Valid core values are:
* (optional) The cache bin to store the data in. Valid core values are:
* - cache: (default) Generic cache storage bin (used for theme registry,
* locale date, list of simpletest tests, etc.).
* - cache_block: Stores the content of various blocks.
@@ -119,7 +121,7 @@ function cache_get_multiple(array &$cids, $bin = 'cache') {
* the administrator panel.
* - cache_path: Stores the system paths that have an alias.
* @param $expire
* One of the following values:
* (optional) One of the following values:
* - CACHE_PERMANENT: Indicates that the item should never be removed unless
* explicitly told to using cache_clear_all() with a cache ID.
* - CACHE_TEMPORARY: Indicates that the item should be removed at the next
@@ -254,10 +256,12 @@ interface DrupalCacheInterface {
* The cache ID of the data to store.
* @param $data
* The data to store in the cache. Complex data types will be automatically
* serialized before insertion.
* Strings will be stored as plain text and not serialized.
* serialized before insertion. Strings will be stored as plain text and not
* serialized. Some storage engines only allow objects up to a maximum of
* 1MB in size to be stored by default. When caching large arrays or
* similar, take care to ensure $data does not exceed this size.
* @param $expire
* One of the following values:
* (optional) One of the following values:
* - CACHE_PERMANENT: Indicates that the item should never be removed unless
* explicitly told to using cache_clear_all() with a cache ID.
* - CACHE_TEMPORARY: Indicates that the item should be removed at the next
+223 -63
View File
@@ -544,37 +544,32 @@ function drupal_get_destination() {
}
/**
* Parses a system URL string into an associative array suitable for url().
* Parses a URL string into its path, query, and fragment components.
*
* This function should only be used for URLs that have been generated by the
* system, such as via url(). It should not be used for URLs that come from
* external sources, or URLs that link to external resources.
* This function splits both internal paths like @code node?b=c#d @endcode and
* external URLs like @code https://example.com/a?b=c#d @endcode into their
* component parts. See
* @link http://tools.ietf.org/html/rfc3986#section-3 RFC 3986 @endlink for an
* explanation of what the component parts are.
*
* The returned array contains a 'path' that may be passed separately to url().
* For example:
* @code
* $options = drupal_parse_url($_GET['destination']);
* $my_url = url($options['path'], $options);
* $my_link = l('Example link', $options['path'], $options);
* @endcode
* Note that, unlike the RFC, when passed an external URL, this function
* groups the scheme, authority, and path together into the path component.
*
* This is required, because url() does not support relative URLs containing a
* query string or fragment in its $path argument. Instead, any query string
* needs to be parsed into an associative query parameter array in
* $options['query'] and the fragment into $options['fragment'].
* @param string $url
* The internal path or external URL string to parse.
*
* @param $url
* The URL string to parse, f.e. $_GET['destination'].
* @return array
* An associative array containing:
* - path: The path component of $url. If $url is an external URL, this
* includes the scheme, authority, and path.
* - query: An array of query parameters from $url, if they exist.
* - fragment: The fragment component from $url, if it exists.
*
* @return
* An associative array containing the keys:
* - 'path': The path of the URL. If the given $url is external, this includes
* the scheme and host.
* - 'query': An array of query parameters of $url, if existent.
* - 'fragment': The fragment of $url, if existent.
*
* @see url()
* @see drupal_goto()
* @see l()
* @see url()
* @see http://tools.ietf.org/html/rfc3986
*
* @ingroup php_wrappers
*/
function drupal_parse_url($url) {
@@ -990,9 +985,10 @@ function drupal_http_request($url, array $options = array()) {
$response = preg_split("/\r\n|\n|\r/", $response);
// Parse the response status line.
list($protocol, $code, $status_message) = explode(' ', trim(array_shift($response)), 3);
$result->protocol = $protocol;
$result->status_message = $status_message;
$response_status_array = _drupal_parse_response_status(trim(array_shift($response)));
$result->protocol = $response_status_array['http_version'];
$result->status_message = $response_status_array['reason_phrase'];
$code = $response_status_array['response_code'];
$result->headers = array();
@@ -1083,12 +1079,43 @@ function drupal_http_request($url, array $options = array()) {
}
break;
default:
$result->error = $status_message;
$result->error = $result->status_message;
}
return $result;
}
/**
* Splits an HTTP response status line into components.
*
* See the @link http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html status line definition @endlink
* in RFC 2616.
*
* @param string $respone
* The response status line, for example 'HTTP/1.1 500 Internal Server Error'.
*
* @return array
* Keyed array containing the component parts. If the response is malformed,
* all possible parts will be extracted. 'reason_phrase' could be empty.
* Possible keys:
* - 'http_version'
* - 'response_code'
* - 'reason_phrase'
*/
function _drupal_parse_response_status($response) {
$response_array = explode(' ', trim($response), 3);
// Set up empty values.
$result = array(
'reason_phrase' => '',
);
$result['http_version'] = $response_array[0];
$result['response_code'] = $response_array[1];
if (isset($response_array[2])) {
$result['reason_phrase'] = $response_array[2];
}
return $result;
}
/**
* Helper function for determining hosts excluded from needing a proxy.
*
@@ -1495,7 +1522,7 @@ function _filter_xss_split($m, $store = FALSE) {
return '&lt;';
}
if (!preg_match('%^<\s*(/\s*)?([a-zA-Z0-9]+)([^>]*)>?|(<!--.*?-->)$%', $string, $matches)) {
if (!preg_match('%^<\s*(/\s*)?([a-zA-Z0-9\-]+)([^>]*)>?|(<!--.*?-->)$%', $string, $matches)) {
// Seriously malformed.
return '';
}
@@ -2187,14 +2214,20 @@ function url($path = NULL, array $options = array()) {
'prefix' => ''
);
// A duplicate of the code from url_is_external() to avoid needing another
// function call, since performance inside url() is critical.
if (!isset($options['external'])) {
// Return an external link if $path contains an allowed absolute URL. Only
// call the slow drupal_strip_dangerous_protocols() if $path contains a ':'
// before any / ? or #. Note: we could use url_is_external($path) here, but
// that would require another function call, and performance inside url() is
// critical.
// Return an external link if $path contains an allowed absolute URL. Avoid
// calling drupal_strip_dangerous_protocols() if there is any slash (/),
// hash (#) or question_mark (?) before the colon (:) occurrence - if any -
// as this would clearly mean it is not a URL. If the path starts with 2
// slashes then it is always considered an external URL without an explicit
// protocol part.
$colonpos = strpos($path, ':');
$options['external'] = ($colonpos !== FALSE && !preg_match('![/?#]!', substr($path, 0, $colonpos)) && drupal_strip_dangerous_protocols($path) == $path);
$options['external'] = (strpos($path, '//') === 0)
|| ($colonpos !== FALSE
&& !preg_match('![/?#]!', substr($path, 0, $colonpos))
&& drupal_strip_dangerous_protocols($path) == $path);
}
// Preserve the original path before altering or aliasing.
@@ -2232,6 +2265,11 @@ function url($path = NULL, array $options = array()) {
return $path . $options['fragment'];
}
// Strip leading slashes from internal paths to prevent them becoming external
// URLs without protocol. /example.com should not be turned into
// //example.com.
$path = ltrim($path, '/');
global $base_url, $base_secure_url, $base_insecure_url;
// The base_url might be rewritten from the language rewrite in domain mode.
@@ -2309,10 +2347,15 @@ function url($path = NULL, array $options = array()) {
*/
function url_is_external($path) {
$colonpos = strpos($path, ':');
// Avoid calling drupal_strip_dangerous_protocols() if there is any
// slash (/), hash (#) or question_mark (?) before the colon (:)
// occurrence - if any - as this would clearly mean it is not a URL.
return $colonpos !== FALSE && !preg_match('![/?#]!', substr($path, 0, $colonpos)) && drupal_strip_dangerous_protocols($path) == $path;
// Avoid calling drupal_strip_dangerous_protocols() if there is any slash (/),
// hash (#) or question_mark (?) before the colon (:) occurrence - if any - as
// this would clearly mean it is not a URL. If the path starts with 2 slashes
// then it is always considered an external URL without an explicit protocol
// part.
return (strpos($path, '//') === 0)
|| ($colonpos !== FALSE
&& !preg_match('![/?#]!', substr($path, 0, $colonpos))
&& drupal_strip_dangerous_protocols($path) == $path);
}
/**
@@ -2609,7 +2652,10 @@ function drupal_deliver_html_page($page_callback_result) {
// Keep old path for reference, and to allow forms to redirect to it.
if (!isset($_GET['destination'])) {
$_GET['destination'] = $_GET['q'];
// Make sure that the current path is not interpreted as external URL.
if (!url_is_external($_GET['q'])) {
$_GET['destination'] = $_GET['q'];
}
}
$path = drupal_get_normal_path(variable_get('site_404', ''));
@@ -2638,7 +2684,10 @@ function drupal_deliver_html_page($page_callback_result) {
// Keep old path for reference, and to allow forms to redirect to it.
if (!isset($_GET['destination'])) {
$_GET['destination'] = $_GET['q'];
// Make sure that the current path is not interpreted as external URL.
if (!url_is_external($_GET['q'])) {
$_GET['destination'] = $_GET['q'];
}
}
$path = drupal_get_normal_path(variable_get('site_403', ''));
@@ -3447,7 +3496,11 @@ function drupal_pre_render_styles($elements) {
$import_batch = array_slice($import, 0, 31);
$import = array_slice($import, 31);
$element = $style_element_defaults;
$element['#value'] = implode("\n", $import_batch);
// This simplifies the JavaScript regex, allowing each line
// (separated by \n) to be treated as a completely different string.
// This means that we can use ^ and $ on one line at a time, and not
// worry about style tags since they'll never match the regex.
$element['#value'] = "\n" . implode("\n", $import_batch) . "\n";
$element['#attributes']['media'] = $group['media'];
$element['#browsers'] = $group['browsers'];
$elements[] = $element;
@@ -3749,7 +3802,7 @@ function drupal_load_stylesheet_content($contents, $optimize = FALSE) {
// Replaces @import commands with the actual stylesheet content.
// This happens recursively but omits external files.
$contents = preg_replace_callback('/@import\s*(?:url\(\s*)?[\'"]?(?![a-z]+:)([^\'"\()]+)[\'"]?\s*\)?\s*;/', '_drupal_load_stylesheet', $contents);
$contents = preg_replace_callback('/@import\s*(?:url\(\s*)?[\'"]?(?![a-z]+:)(?!\/\/)([^\'"\()]+)[\'"]?\s*\)?\s*;/', '_drupal_load_stylesheet', $contents);
return $contents;
}
@@ -3773,7 +3826,7 @@ function _drupal_load_stylesheet($matches) {
// Alter all internal url() paths. Leave external paths alone. We don't need
// to normalize absolute paths here (i.e. remove folder/... segments) because
// that will be done later.
return preg_replace('/url\(\s*([\'"]?)(?![a-z]+:|\/+)/i', 'url(\1'. $directory, $file);
return preg_replace('/url\(\s*([\'"]?)(?![a-z]+:|\/+)([^\'")]+)([\'"]?)\s*\)/i', 'url(\1' . $directory . '\2\3)', $file);
}
/**
@@ -4109,6 +4162,13 @@ function drupal_region_class($region) {
* else being the same, JavaScript added by a call to drupal_add_js() that
* happened later in the page request gets added to the page after one for
* which drupal_add_js() happened earlier in the page request.
* - requires_jquery: Set this to FALSE if the JavaScript you are adding does
* not have a dependency on jQuery. Defaults to TRUE, except for JavaScript
* settings where it defaults to FALSE. This is used on sites that have the
* 'javascript_always_use_jquery' variable set to FALSE; on those sites, if
* all the JavaScript added to the page by drupal_add_js() does not have a
* dependency on jQuery, then for improved front-end performance Drupal
* will not add jQuery and related libraries and settings to the page.
* - defer: If set to TRUE, the defer attribute is set on the <script>
* tag. Defaults to FALSE.
* - cache: If set to FALSE, the JavaScript file is loaded anew on every page
@@ -4126,6 +4186,14 @@ function drupal_region_class($region) {
*/
function drupal_add_js($data = NULL, $options = NULL) {
$javascript = &drupal_static(__FUNCTION__, array());
$jquery_added = &drupal_static(__FUNCTION__ . ':jquery_added', FALSE);
// If the $javascript variable has been reset with drupal_static_reset(),
// jQuery and related files will have been removed from the list, so set the
// variable back to FALSE to indicate they have not yet been added.
if (empty($javascript)) {
$jquery_added = FALSE;
}
// Construct the options, taking the defaults into consideration.
if (isset($options)) {
@@ -4136,6 +4204,9 @@ function drupal_add_js($data = NULL, $options = NULL) {
else {
$options = array();
}
if (isset($options['type']) && $options['type'] == 'setting') {
$options += array('requires_jquery' => FALSE);
}
$options += drupal_js_defaults($data);
// Preprocess can only be set if caching is enabled.
@@ -4146,14 +4217,18 @@ function drupal_add_js($data = NULL, $options = NULL) {
$options['weight'] += count($javascript) / 1000;
if (isset($data)) {
// Add jquery.js and drupal.js, as well as the basePath setting, the
// first time a JavaScript file is added.
if (empty($javascript)) {
// Add jquery.js, drupal.js, and related files and settings if they have
// not been added yet. However, if the 'javascript_always_use_jquery'
// variable is set to FALSE (indicating that the site does not want jQuery
// automatically added on all pages) then only add it if a file or setting
// that requires jQuery is being added also.
if (!$jquery_added && (variable_get('javascript_always_use_jquery', TRUE) || $options['requires_jquery'])) {
$jquery_added = TRUE;
// url() generates the prefix using hook_url_outbound_alter(). Instead of
// running the hook_url_outbound_alter() again here, extract the prefix
// from url().
url('', array('prefix' => &$prefix));
$javascript = array(
$default_javascript = array(
'settings' => array(
'data' => array(
array('basePath' => base_path()),
@@ -4172,11 +4247,13 @@ function drupal_add_js($data = NULL, $options = NULL) {
'group' => JS_LIBRARY,
'every_page' => TRUE,
'weight' => -1,
'requires_jquery' => TRUE,
'preprocess' => TRUE,
'cache' => TRUE,
'defer' => FALSE,
),
);
$javascript = drupal_array_merge_deep($javascript, $default_javascript);
// Register all required libraries.
drupal_add_library('system', 'jquery', TRUE);
drupal_add_library('system', 'jquery.once', TRUE);
@@ -4217,6 +4294,7 @@ function drupal_js_defaults($data = NULL) {
'group' => JS_DEFAULT,
'every_page' => FALSE,
'weight' => 0,
'requires_jquery' => TRUE,
'scope' => 'header',
'cache' => TRUE,
'defer' => FALSE,
@@ -4263,7 +4341,12 @@ function drupal_get_js($scope = 'header', $javascript = NULL, $skip_alter = FALS
if (!isset($javascript)) {
$javascript = drupal_add_js();
}
if (empty($javascript)) {
// If no JavaScript items have been added, or if the only JavaScript items
// that have been added are JavaScript settings (which don't do anything
// without any JavaScript code to use them), then no JavaScript code should
// be added to the page.
if (empty($javascript) || (isset($javascript['settings']) && count($javascript) == 1)) {
return '';
}
@@ -4417,8 +4500,8 @@ function drupal_get_js($scope = 'header', $javascript = NULL, $skip_alter = FALS
*
* Libraries, JavaScript, CSS and other types of custom structures are attached
* to elements using the #attached property. The #attached property is an
* associative array, where the keys are the the attachment types and the values
* are the attached data. For example:
* associative array, where the keys are the attachment types and the values are
* the attached data. For example:
* @code
* $build['#attached'] = array(
* 'js' => array(drupal_get_path('module', 'taxonomy') . '/taxonomy.js'),
@@ -5260,8 +5343,6 @@ function drupal_cron_run() {
foreach ($queues as $queue_name => $info) {
DrupalQueue::get($queue_name)->createQueue();
}
// Register shutdown callback.
drupal_register_shutdown_function('drupal_cron_cleanup');
// Iterate through the modules calling their cron handlers (if any):
foreach (module_implements('cron') as $module) {
@@ -5313,10 +5394,13 @@ function drupal_cron_run() {
}
/**
* Shutdown function: Performs cron cleanup.
* DEPRECATED: Shutdown function: Performs cron cleanup.
*
* @see drupal_cron_run()
* @see drupal_register_shutdown_function()
* This function is deprecated because the 'cron_semaphore' variable it
* references no longer exists. It is therefore no longer used as a shutdown
* function by Drupal core.
*
* @deprecated
*/
function drupal_cron_cleanup() {
// See if the semaphore is still locked.
@@ -6245,13 +6329,21 @@ function drupal_render_cid_parts($granularity = NULL) {
}
if (!empty($granularity)) {
$cache_per_role = $granularity & DRUPAL_CACHE_PER_ROLE;
$cache_per_user = $granularity & DRUPAL_CACHE_PER_USER;
// User 1 has special permissions outside of the role system, so when
// caching per role is requested, it should cache per user instead.
if ($user->uid == 1 && $cache_per_role) {
$cache_per_user = TRUE;
$cache_per_role = FALSE;
}
// 'PER_ROLE' and 'PER_USER' are mutually exclusive. 'PER_USER' can be a
// resource drag for sites with many users, so when a module is being
// equivocal, we favor the less expensive 'PER_ROLE' pattern.
if ($granularity & DRUPAL_CACHE_PER_ROLE) {
if ($cache_per_role) {
$cid_parts[] = 'r.' . implode(',', array_keys($user->roles));
}
elseif ($granularity & DRUPAL_CACHE_PER_USER) {
elseif ($cache_per_user) {
$cid_parts[] = "u.$user->uid";
}
@@ -6641,10 +6733,10 @@ function drupal_array_set_nested_value(array &$array, array $parents, $value, $f
* $value = drupal_array_get_nested_value($form, $parents);
* @endcode
*
* The return value will be NULL, regardless of whether the actual value is NULL
* or whether the requested key does not exist. If it is required to know
* whether the nested array key actually exists, pass a third argument that is
* altered by reference:
* A return value of NULL is ambiguous, and can mean either that the requested
* key does not exist, or that the actual value is NULL. If it is required to
* know whether the nested array key actually exists, pass a third argument that
* is altered by reference:
* @code
* $key_exists = NULL;
* $value = drupal_array_get_nested_value($form, $parents, $key_exists);
@@ -7053,6 +7145,23 @@ function _drupal_schema_initialize(&$schema, $module, $remove_descriptions = TRU
}
}
/**
* Retrieves the type for every field in a table schema.
*
* @param $table
* The name of the table from which to retrieve type information.
*
* @return
* An array of types, keyed by field name.
*/
function drupal_schema_field_types($table) {
$table_schema = drupal_get_schema($table);
foreach ($table_schema['fields'] as $field_name => $field_info) {
$field_types[$field_name] = isset($field_info['type']) ? $field_info['type'] : NULL;
}
return $field_types;
}
/**
* Retrieves a list of fields from a table schema.
*
@@ -7677,6 +7786,7 @@ function entity_get_info($entity_type = NULL) {
// Prepare entity schema fields SQL info for
// DrupalEntityControllerInterface::buildQuery().
if (isset($entity_info[$name]['base table'])) {
$entity_info[$name]['base table field types'] = drupal_schema_field_types($entity_info[$name]['base table']);
$entity_info[$name]['schema_fields_sql']['base table'] = drupal_schema_fields_sql($entity_info[$name]['base table']);
if (isset($entity_info[$name]['revision table'])) {
$entity_info[$name]['schema_fields_sql']['revision table'] = drupal_schema_fields_sql($entity_info[$name]['revision table']);
@@ -7903,6 +8013,56 @@ function entity_prepare_view($entity_type, $entities, $langcode = NULL) {
}
}
/**
* Invoke hook_entity_view_mode_alter().
*
* If adding a new entity similar to nodes, comments or users, you should invoke
* this function during the ENTITY_build_content() or ENTITY_view_multiple()
* phases of rendering to allow other modules to alter the view mode during this
* phase. This function needs to be called before field_attach_prepare_view() to
* ensure that the correct content is loaded by field API.
*
* @param $entity_type
* The type of entity, i.e. 'node', 'user'.
* @param $entities
* The entity objects which are being prepared for view, keyed by object ID.
* @param $view_mode
* The original view mode e.g. 'full', 'teaser'...
* @param $langcode
* (optional) A language code to be used for rendering. Defaults to the global
* content language of the current request.
* @return
* An associative array with arrays of entities keyed by view mode.
*
* @see hook_entity_view_mode_alter()
*/
function entity_view_mode_prepare($entity_type, $entities, $view_mode, $langcode = NULL) {
if (!isset($langcode)) {
$langcode = $GLOBALS['language_content']->language;
}
// To ensure hooks are never run after field_attach_prepare_view() only
// process items without the entity_view_prepared flag.
$entities_by_view_mode = array();
foreach ($entities as $id => $entity) {
$entity_view_mode = $view_mode;
if (empty($entity->entity_view_prepared)) {
// Allow modules to change the view mode.
$context = array(
'entity_type' => $entity_type,
'entity' => $entity,
'langcode' => $langcode,
);
drupal_alter('entity_view_mode', $entity_view_mode, $context);
}
$entities_by_view_mode[$entity_view_mode][$id] = $entity;
}
return $entities_by_view_mode;
}
/**
* Returns the URI elements of an entity.
*
+4 -4
View File
@@ -626,7 +626,7 @@ abstract class DatabaseConnection extends PDO {
* A sanitized version of the query comment string.
*/
protected function filterComment($comment = '') {
return preg_replace('/(\/\*\s*)|(\s*\*\/)/', '', $comment);
return strtr($comment, array('*' => ' * '));
}
/**
@@ -736,7 +736,7 @@ abstract class DatabaseConnection extends PDO {
// to expand it out into a comma-delimited set of placeholders.
foreach (array_filter($args, 'is_array') as $key => $data) {
$new_keys = array();
foreach ($data as $i => $value) {
foreach (array_values($data) as $i => $value) {
// This assumes that there are no other placeholders that use the same
// name. For example, if the array placeholder is defined as :example
// and there is already an :example_2 placeholder, this will generate
@@ -2832,7 +2832,7 @@ function db_drop_table($table) {
* will be set to the value of the key in all rows. This is most useful for
* creating NOT NULL columns with no default value in existing tables.
* @param $keys_new
* Optional keys and indexes specification to be created on the table along
* (optional) Keys and indexes specification to be created on the table along
* with adding the field. The format is the same as a table specification, but
* without the 'fields' element. If you are adding a type 'serial' field, you
* MUST specify at least one key or index including it in this array. See
@@ -3012,7 +3012,7 @@ function db_drop_index($table, $name) {
* @param $spec
* The field specification for the new field.
* @param $keys_new
* Optional keys and indexes specification to be created on the table along
* (optional) Keys and indexes specification to be created on the table along
* with changing the field. The format is the same as a table specification
* but without the 'fields' element.
*/
+4
View File
@@ -36,6 +36,10 @@ class DatabaseConnection_mysql extends DatabaseConnection {
// Default to TCP connection on port 3306.
$dsn = 'mysql:host=' . $connection_options['host'] . ';port=' . (empty($connection_options['port']) ? 3306 : $connection_options['port']);
}
// Character set is added to dsn to ensure PDO uses the proper character
// set when escaping. This has security implications. See
// https://www.drupal.org/node/1201452 for further discussion.
$dsn .= ';charset=utf8';
$dsn .= ';dbname=' . $connection_options['database'];
// Allow PDO options to be overridden.
$connection_options += array(
+15 -15
View File
@@ -40,7 +40,7 @@ class DatabaseSchema_mysql extends DatabaseSchema {
}
else {
$db_info = Database::getConnectionInfo();
$info['database'] = $db_info['default']['database'];
$info['database'] = $db_info[$this->connection->getTarget()]['database'];
$info['table'] = $table;
}
return $info;
@@ -301,10 +301,10 @@ class DatabaseSchema_mysql extends DatabaseSchema {
public function renameTable($table, $new_name) {
if (!$this->tableExists($table)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot rename %table to %table_new: table %table doesn't exist.", array('%table' => $table, '%table_new' => $new_name)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot rename @table to @table_new: table @table doesn't exist.", array('@table' => $table, '@table_new' => $new_name)));
}
if ($this->tableExists($new_name)) {
throw new DatabaseSchemaObjectExistsException(t("Cannot rename %table to %table_new: table %table_new already exists.", array('%table' => $table, '%table_new' => $new_name)));
throw new DatabaseSchemaObjectExistsException(t("Cannot rename @table to @table_new: table @table_new already exists.", array('@table' => $table, '@table_new' => $new_name)));
}
$info = $this->getPrefixInfo($new_name);
@@ -322,10 +322,10 @@ class DatabaseSchema_mysql extends DatabaseSchema {
public function addField($table, $field, $spec, $keys_new = array()) {
if (!$this->tableExists($table)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add field %table.%field: table doesn't exist.", array('%field' => $field, '%table' => $table)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add field @table.@field: table doesn't exist.", array('@field' => $field, '@table' => $table)));
}
if ($this->fieldExists($table, $field)) {
throw new DatabaseSchemaObjectExistsException(t("Cannot add field %table.%field: field already exists.", array('%field' => $field, '%table' => $table)));
throw new DatabaseSchemaObjectExistsException(t("Cannot add field @table.@field: field already exists.", array('@field' => $field, '@table' => $table)));
}
$fixnull = FALSE;
@@ -361,7 +361,7 @@ class DatabaseSchema_mysql extends DatabaseSchema {
public function fieldSetDefault($table, $field, $default) {
if (!$this->fieldExists($table, $field)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot set default value of field %table.%field: field doesn't exist.", array('%table' => $table, '%field' => $field)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot set default value of field @table.@field: field doesn't exist.", array('@table' => $table, '@field' => $field)));
}
if (!isset($default)) {
@@ -376,7 +376,7 @@ class DatabaseSchema_mysql extends DatabaseSchema {
public function fieldSetNoDefault($table, $field) {
if (!$this->fieldExists($table, $field)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot remove default value of field %table.%field: field doesn't exist.", array('%table' => $table, '%field' => $field)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot remove default value of field @table.@field: field doesn't exist.", array('@table' => $table, '@field' => $field)));
}
$this->connection->query('ALTER TABLE {' . $table . '} ALTER COLUMN `' . $field . '` DROP DEFAULT');
@@ -391,10 +391,10 @@ class DatabaseSchema_mysql extends DatabaseSchema {
public function addPrimaryKey($table, $fields) {
if (!$this->tableExists($table)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add primary key to table %table: table doesn't exist.", array('%table' => $table)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add primary key to table @table: table doesn't exist.", array('@table' => $table)));
}
if ($this->indexExists($table, 'PRIMARY')) {
throw new DatabaseSchemaObjectExistsException(t("Cannot add primary key to table %table: primary key already exists.", array('%table' => $table)));
throw new DatabaseSchemaObjectExistsException(t("Cannot add primary key to table @table: primary key already exists.", array('@table' => $table)));
}
$this->connection->query('ALTER TABLE {' . $table . '} ADD PRIMARY KEY (' . $this->createKeySql($fields) . ')');
@@ -411,10 +411,10 @@ class DatabaseSchema_mysql extends DatabaseSchema {
public function addUniqueKey($table, $name, $fields) {
if (!$this->tableExists($table)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add unique key %name to table %table: table doesn't exist.", array('%table' => $table, '%name' => $name)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add unique key @name to table @table: table doesn't exist.", array('@table' => $table, '@name' => $name)));
}
if ($this->indexExists($table, $name)) {
throw new DatabaseSchemaObjectExistsException(t("Cannot add unique key %name to table %table: unique key already exists.", array('%table' => $table, '%name' => $name)));
throw new DatabaseSchemaObjectExistsException(t("Cannot add unique key @name to table @table: unique key already exists.", array('@table' => $table, '@name' => $name)));
}
$this->connection->query('ALTER TABLE {' . $table . '} ADD UNIQUE KEY `' . $name . '` (' . $this->createKeySql($fields) . ')');
@@ -431,10 +431,10 @@ class DatabaseSchema_mysql extends DatabaseSchema {
public function addIndex($table, $name, $fields) {
if (!$this->tableExists($table)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add index %name to table %table: table doesn't exist.", array('%table' => $table, '%name' => $name)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add index @name to table @table: table doesn't exist.", array('@table' => $table, '@name' => $name)));
}
if ($this->indexExists($table, $name)) {
throw new DatabaseSchemaObjectExistsException(t("Cannot add index %name to table %table: index already exists.", array('%table' => $table, '%name' => $name)));
throw new DatabaseSchemaObjectExistsException(t("Cannot add index @name to table @table: index already exists.", array('@table' => $table, '@name' => $name)));
}
$this->connection->query('ALTER TABLE {' . $table . '} ADD INDEX `' . $name . '` (' . $this->createKeySql($fields) . ')');
@@ -451,10 +451,10 @@ class DatabaseSchema_mysql extends DatabaseSchema {
public function changeField($table, $field, $field_new, $spec, $keys_new = array()) {
if (!$this->fieldExists($table, $field)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot change the definition of field %table.%name: field doesn't exist.", array('%table' => $table, '%name' => $field)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot change the definition of field @table.@name: field doesn't exist.", array('@table' => $table, '@name' => $field)));
}
if (($field != $field_new) && $this->fieldExists($table, $field_new)) {
throw new DatabaseSchemaObjectExistsException(t("Cannot rename field %table.%name to %name_new: target field already exists.", array('%table' => $table, '%name' => $field, '%name_new' => $field_new)));
throw new DatabaseSchemaObjectExistsException(t("Cannot rename field @table.@name to @name_new: target field already exists.", array('@table' => $table, '@name' => $field, '@name_new' => $field_new)));
}
$sql = 'ALTER TABLE {' . $table . '} CHANGE `' . $field . '` ' . $this->createFieldSql($field_new, $this->processField($spec));
+14 -14
View File
@@ -314,10 +314,10 @@ class DatabaseSchema_pgsql extends DatabaseSchema {
function renameTable($table, $new_name) {
if (!$this->tableExists($table)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot rename %table to %table_new: table %table doesn't exist.", array('%table' => $table, '%table_new' => $new_name)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot rename @table to @table_new: table @table doesn't exist.", array('@table' => $table, '@table_new' => $new_name)));
}
if ($this->tableExists($new_name)) {
throw new DatabaseSchemaObjectExistsException(t("Cannot rename %table to %table_new: table %table_new already exists.", array('%table' => $table, '%table_new' => $new_name)));
throw new DatabaseSchemaObjectExistsException(t("Cannot rename @table to @table_new: table @table_new already exists.", array('@table' => $table, '@table_new' => $new_name)));
}
// Get the schema and tablename for the old table.
@@ -351,10 +351,10 @@ class DatabaseSchema_pgsql extends DatabaseSchema {
public function addField($table, $field, $spec, $new_keys = array()) {
if (!$this->tableExists($table)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add field %table.%field: table doesn't exist.", array('%field' => $field, '%table' => $table)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add field @table.@field: table doesn't exist.", array('@field' => $field, '@table' => $table)));
}
if ($this->fieldExists($table, $field)) {
throw new DatabaseSchemaObjectExistsException(t("Cannot add field %table.%field: field already exists.", array('%field' => $field, '%table' => $table)));
throw new DatabaseSchemaObjectExistsException(t("Cannot add field @table.@field: field already exists.", array('@field' => $field, '@table' => $table)));
}
$fixnull = FALSE;
@@ -393,7 +393,7 @@ class DatabaseSchema_pgsql extends DatabaseSchema {
public function fieldSetDefault($table, $field, $default) {
if (!$this->fieldExists($table, $field)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot set default value of field %table.%field: field doesn't exist.", array('%table' => $table, '%field' => $field)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot set default value of field @table.@field: field doesn't exist.", array('@table' => $table, '@field' => $field)));
}
if (!isset($default)) {
@@ -408,7 +408,7 @@ class DatabaseSchema_pgsql extends DatabaseSchema {
public function fieldSetNoDefault($table, $field) {
if (!$this->fieldExists($table, $field)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot remove default value of field %table.%field: field doesn't exist.", array('%table' => $table, '%field' => $field)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot remove default value of field @table.@field: field doesn't exist.", array('@table' => $table, '@field' => $field)));
}
$this->connection->query('ALTER TABLE {' . $table . '} ALTER COLUMN "' . $field . '" DROP DEFAULT');
@@ -435,10 +435,10 @@ class DatabaseSchema_pgsql extends DatabaseSchema {
public function addPrimaryKey($table, $fields) {
if (!$this->tableExists($table)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add primary key to table %table: table doesn't exist.", array('%table' => $table)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add primary key to table @table: table doesn't exist.", array('@table' => $table)));
}
if ($this->constraintExists($table, 'pkey')) {
throw new DatabaseSchemaObjectExistsException(t("Cannot add primary key to table %table: primary key already exists.", array('%table' => $table)));
throw new DatabaseSchemaObjectExistsException(t("Cannot add primary key to table @table: primary key already exists.", array('@table' => $table)));
}
$this->connection->query('ALTER TABLE {' . $table . '} ADD PRIMARY KEY (' . implode(',', $fields) . ')');
@@ -455,10 +455,10 @@ class DatabaseSchema_pgsql extends DatabaseSchema {
function addUniqueKey($table, $name, $fields) {
if (!$this->tableExists($table)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add unique key %name to table %table: table doesn't exist.", array('%table' => $table, '%name' => $name)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add unique key @name to table @table: table doesn't exist.", array('@table' => $table, '@name' => $name)));
}
if ($this->constraintExists($table, $name . '_key')) {
throw new DatabaseSchemaObjectExistsException(t("Cannot add unique key %name to table %table: unique key already exists.", array('%table' => $table, '%name' => $name)));
throw new DatabaseSchemaObjectExistsException(t("Cannot add unique key @name to table @table: unique key already exists.", array('@table' => $table, '@name' => $name)));
}
$this->connection->query('ALTER TABLE {' . $table . '} ADD CONSTRAINT "' . $this->prefixNonTable($table, $name, 'key') . '" UNIQUE (' . implode(',', $fields) . ')');
@@ -475,10 +475,10 @@ class DatabaseSchema_pgsql extends DatabaseSchema {
public function addIndex($table, $name, $fields) {
if (!$this->tableExists($table)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add index %name to table %table: table doesn't exist.", array('%table' => $table, '%name' => $name)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add index @name to table @table: table doesn't exist.", array('@table' => $table, '@name' => $name)));
}
if ($this->indexExists($table, $name)) {
throw new DatabaseSchemaObjectExistsException(t("Cannot add index %name to table %table: index already exists.", array('%table' => $table, '%name' => $name)));
throw new DatabaseSchemaObjectExistsException(t("Cannot add index @name to table @table: index already exists.", array('@table' => $table, '@name' => $name)));
}
$this->connection->query($this->_createIndexSql($table, $name, $fields));
@@ -495,10 +495,10 @@ class DatabaseSchema_pgsql extends DatabaseSchema {
public function changeField($table, $field, $field_new, $spec, $new_keys = array()) {
if (!$this->fieldExists($table, $field)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot change the definition of field %table.%name: field doesn't exist.", array('%table' => $table, '%name' => $field)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot change the definition of field @table.@name: field doesn't exist.", array('@table' => $table, '@name' => $field)));
}
if (($field != $field_new) && $this->fieldExists($table, $field_new)) {
throw new DatabaseSchemaObjectExistsException(t("Cannot rename field %table.%name to %name_new: target field already exists.", array('%table' => $table, '%name' => $field, '%name_new' => $field_new)));
throw new DatabaseSchemaObjectExistsException(t("Cannot rename field @table.@name to @name_new: target field already exists.", array('@table' => $table, '@name' => $field, '@name_new' => $field_new)));
}
$spec = $this->processField($spec);
+1 -1
View File
@@ -1694,7 +1694,7 @@ class DatabaseCondition implements QueryConditionInterface, Countable {
* Implements Countable::count().
*
* Returns the size of this conditional. The size of the conditional is the
* size of its conditional array minus one, because one element is the the
* size of its conditional array minus one, because one element is the
* conjunction.
*/
public function count() {
+3 -3
View File
@@ -416,7 +416,7 @@ abstract class DatabaseSchema implements QueryPlaceholderInterface {
* This is most useful for creating NOT NULL columns with no default
* value in existing tables.
* @param $keys_new
* Optional keys and indexes specification to be created on the
* (optional) Keys and indexes specification to be created on the
* table along with adding the field. The format is the same as a
* table specification but without the 'fields' element. If you are
* adding a type 'serial' field, you MUST specify at least one key
@@ -630,7 +630,7 @@ abstract class DatabaseSchema implements QueryPlaceholderInterface {
* @param $spec
* The field specification for the new field.
* @param $keys_new
* Optional keys and indexes specification to be created on the
* (optional) Keys and indexes specification to be created on the
* table along with changing the field. The format is the same as a
* table specification but without the 'fields' element.
*
@@ -654,7 +654,7 @@ abstract class DatabaseSchema implements QueryPlaceholderInterface {
*/
public function createTable($name, $table) {
if ($this->tableExists($name)) {
throw new DatabaseSchemaObjectExistsException(t('Table %name already exists.', array('%name' => $name)));
throw new DatabaseSchemaObjectExistsException(t('Table @name already exists.', array('@name' => $name)));
}
$statements = $this->createTableSql($name, $table);
foreach ($statements as $statement) {
+4 -1
View File
@@ -377,7 +377,8 @@ interface SelectQueryInterface extends QueryConditionInterface, QueryAlterableIn
* @param $field
* The field on which to order.
* @param $direction
* The direction to sort. Legal values are "ASC" and "DESC".
* The direction to sort. Legal values are "ASC" and "DESC". Any other value
* will be converted to "ASC".
* @return SelectQueryInterface
* The called object.
*/
@@ -1384,6 +1385,8 @@ class SelectQuery extends Query implements SelectQueryInterface {
}
public function orderBy($field, $direction = 'ASC') {
// Only allow ASC and DESC, default to ASC.
$direction = strtoupper($direction) == 'DESC' ? 'DESC' : 'ASC';
$this->order[$field] = $direction;
return $this;
}
+14 -14
View File
@@ -232,10 +232,10 @@ class DatabaseSchema_sqlite extends DatabaseSchema {
public function renameTable($table, $new_name) {
if (!$this->tableExists($table)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot rename %table to %table_new: table %table doesn't exist.", array('%table' => $table, '%table_new' => $new_name)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot rename @table to @table_new: table @table doesn't exist.", array('@table' => $table, '@table_new' => $new_name)));
}
if ($this->tableExists($new_name)) {
throw new DatabaseSchemaObjectExistsException(t("Cannot rename %table to %table_new: table %table_new already exists.", array('%table' => $table, '%table_new' => $new_name)));
throw new DatabaseSchemaObjectExistsException(t("Cannot rename @table to @table_new: table @table_new already exists.", array('@table' => $table, '@table_new' => $new_name)));
}
$schema = $this->introspectSchema($table);
@@ -278,10 +278,10 @@ class DatabaseSchema_sqlite extends DatabaseSchema {
public function addField($table, $field, $specification, $keys_new = array()) {
if (!$this->tableExists($table)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add field %table.%field: table doesn't exist.", array('%field' => $field, '%table' => $table)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add field @table.@field: table doesn't exist.", array('@field' => $field, '@table' => $table)));
}
if ($this->fieldExists($table, $field)) {
throw new DatabaseSchemaObjectExistsException(t("Cannot add field %table.%field: field already exists.", array('%field' => $field, '%table' => $table)));
throw new DatabaseSchemaObjectExistsException(t("Cannot add field @table.@field: field already exists.", array('@field' => $field, '@table' => $table)));
}
// SQLite doesn't have a full-featured ALTER TABLE statement. It only
@@ -494,10 +494,10 @@ class DatabaseSchema_sqlite extends DatabaseSchema {
public function changeField($table, $field, $field_new, $spec, $keys_new = array()) {
if (!$this->fieldExists($table, $field)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot change the definition of field %table.%name: field doesn't exist.", array('%table' => $table, '%name' => $field)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot change the definition of field @table.@name: field doesn't exist.", array('@table' => $table, '@name' => $field)));
}
if (($field != $field_new) && $this->fieldExists($table, $field_new)) {
throw new DatabaseSchemaObjectExistsException(t("Cannot rename field %table.%name to %name_new: target field already exists.", array('%table' => $table, '%name' => $field, '%name_new' => $field_new)));
throw new DatabaseSchemaObjectExistsException(t("Cannot rename field @table.@name to @name_new: target field already exists.", array('@table' => $table, '@name' => $field, '@name_new' => $field_new)));
}
$old_schema = $this->introspectSchema($table);
@@ -559,10 +559,10 @@ class DatabaseSchema_sqlite extends DatabaseSchema {
public function addIndex($table, $name, $fields) {
if (!$this->tableExists($table)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add index %name to table %table: table doesn't exist.", array('%table' => $table, '%name' => $name)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add index @name to table @table: table doesn't exist.", array('@table' => $table, '@name' => $name)));
}
if ($this->indexExists($table, $name)) {
throw new DatabaseSchemaObjectExistsException(t("Cannot add index %name to table %table: index already exists.", array('%table' => $table, '%name' => $name)));
throw new DatabaseSchemaObjectExistsException(t("Cannot add index @name to table @table: index already exists.", array('@table' => $table, '@name' => $name)));
}
$schema['indexes'][$name] = $fields;
@@ -591,10 +591,10 @@ class DatabaseSchema_sqlite extends DatabaseSchema {
public function addUniqueKey($table, $name, $fields) {
if (!$this->tableExists($table)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add unique key %name to table %table: table doesn't exist.", array('%table' => $table, '%name' => $name)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add unique key @name to table @table: table doesn't exist.", array('@table' => $table, '@name' => $name)));
}
if ($this->indexExists($table, $name)) {
throw new DatabaseSchemaObjectExistsException(t("Cannot add unique key %name to table %table: unique key already exists.", array('%table' => $table, '%name' => $name)));
throw new DatabaseSchemaObjectExistsException(t("Cannot add unique key @name to table @table: unique key already exists.", array('@table' => $table, '@name' => $name)));
}
$schema['unique keys'][$name] = $fields;
@@ -617,14 +617,14 @@ class DatabaseSchema_sqlite extends DatabaseSchema {
public function addPrimaryKey($table, $fields) {
if (!$this->tableExists($table)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add primary key to table %table: table doesn't exist.", array('%table' => $table)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add primary key to table @table: table doesn't exist.", array('@table' => $table)));
}
$old_schema = $this->introspectSchema($table);
$new_schema = $old_schema;
if (!empty($new_schema['primary key'])) {
throw new DatabaseSchemaObjectExistsException(t("Cannot add primary key to table %table: primary key already exists.", array('%table' => $table)));
throw new DatabaseSchemaObjectExistsException(t("Cannot add primary key to table @table: primary key already exists.", array('@table' => $table)));
}
$new_schema['primary key'] = $fields;
@@ -646,7 +646,7 @@ class DatabaseSchema_sqlite extends DatabaseSchema {
public function fieldSetDefault($table, $field, $default) {
if (!$this->fieldExists($table, $field)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot set default value of field %table.%field: field doesn't exist.", array('%table' => $table, '%field' => $field)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot set default value of field @table.@field: field doesn't exist.", array('@table' => $table, '@field' => $field)));
}
$old_schema = $this->introspectSchema($table);
@@ -658,7 +658,7 @@ class DatabaseSchema_sqlite extends DatabaseSchema {
public function fieldSetNoDefault($table, $field) {
if (!$this->fieldExists($table, $field)) {
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot remove default value of field %table.%field: field doesn't exist.", array('%table' => $table, '%field' => $field)));
throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot remove default value of field @table.@field: field doesn't exist.", array('@table' => $table, '@field' => $field)));
}
$old_schema = $this->introspectSchema($table);
+41 -3
View File
@@ -28,7 +28,9 @@ interface DrupalEntityControllerInterface {
* @param $ids
* An array of entity IDs, or FALSE to load all entities.
* @param $conditions
* An array of conditions in the form 'field' => $value.
* An array of conditions. Keys are field names on the entity's base table.
* Values will be compared for equality. All the comparisons will be ANDed
* together. This parameter is deprecated; use an EntityFieldQuery instead.
*
* @return
* An array of entity objects indexed by their ids. When no results are
@@ -46,7 +48,7 @@ interface DrupalEntityControllerInterface {
class DrupalDefaultEntityController implements DrupalEntityControllerInterface {
/**
* Static cache of entities.
* Static cache of entities, keyed by entity ID.
*
* @var array
*/
@@ -181,6 +183,11 @@ class DrupalDefaultEntityController implements DrupalEntityControllerInterface {
}
}
// Ensure integer entity IDs are valid.
if (!empty($ids)) {
$this->cleanIds($ids);
}
// Load any remaining entities from the database. This is the case if $ids
// is set to FALSE (so we load all entities), if there are any ids left to
// load, if loading a revision, or if $conditions was passed without $ids.
@@ -221,6 +228,35 @@ class DrupalDefaultEntityController implements DrupalEntityControllerInterface {
return $entities;
}
/**
* Ensures integer entity IDs are valid.
*
* The identifier sanitization provided by this method has been introduced
* as Drupal used to rely on the database to facilitate this, which worked
* correctly with MySQL but led to errors with other DBMS such as PostgreSQL.
*
* @param array $ids
* The entity IDs to verify. Non-integer IDs are removed from this array if
* the entity type requires IDs to be integers.
*/
protected function cleanIds(&$ids) {
$entity_info = entity_get_info($this->entityType);
if (isset($entity_info['base table field types'])) {
$id_type = $entity_info['base table field types'][$this->idKey];
if ($id_type == 'serial' || $id_type == 'int') {
$ids = array_filter($ids, array($this, 'filterId'));
$ids = array_map('intval', $ids);
}
}
}
/**
* Callback for array_filter that removes non-integer IDs.
*/
protected function filterId($id) {
return is_numeric($id) && $id == (int) $id;
}
/**
* Builds the query to load the entity.
*
@@ -236,7 +272,9 @@ class DrupalDefaultEntityController implements DrupalEntityControllerInterface {
* @param $ids
* An array of entity IDs, or FALSE to load all entities.
* @param $conditions
* An array of conditions in the form 'field' => $value.
* An array of conditions. Keys are field names on the entity's base table.
* Values will be compared for equality. All the comparisons will be ANDed
* together. This parameter is deprecated; use an EntityFieldQuery instead.
* @param $revision_id
* The ID of the revision to load, or FALSE if this query is asking for the
* most current revision(s).
+75 -33
View File
@@ -1152,7 +1152,7 @@ function file_munge_filename($filename, $extensions, $alerts = TRUE) {
// Remove any null bytes. See http://php.net/manual/security.filesystem.nullbytes.php
$filename = str_replace(chr(0), '', $filename);
$whitelist = array_unique(explode(' ', trim($extensions)));
$whitelist = array_unique(explode(' ', strtolower(trim($extensions))));
// Split the filename up by periods. The first part becomes the basename
// the last part the final extension.
@@ -1165,7 +1165,7 @@ function file_munge_filename($filename, $extensions, $alerts = TRUE) {
// of allowed extensions.
foreach ($filename_parts as $filename_part) {
$new_filename .= '.' . $filename_part;
if (!in_array($filename_part, $whitelist) && preg_match("/^[a-zA-Z]{2,5}\d?$/", $filename_part)) {
if (!in_array(strtolower($filename_part), $whitelist) && preg_match("/^[a-zA-Z]{2,5}\d?$/", $filename_part)) {
$new_filename .= '_';
}
}
@@ -1559,7 +1559,7 @@ function file_save_upload($form_field_name, $validators = array(), $destination
return FALSE;
}
// Add in our check of the the file name length.
// Add in our check of the file name length.
$validators['file_validate_name_length'] = array();
// Call the validation functions specified by this function's caller.
@@ -1729,8 +1729,6 @@ function file_validate_extensions(stdClass $file, $extensions) {
/**
* Checks that the file's size is below certain limits.
*
* This check is not enforced for the user #1.
*
* @param $file
* A Drupal file object.
* @param $file_limit
@@ -1748,20 +1746,17 @@ function file_validate_extensions(stdClass $file, $extensions) {
*/
function file_validate_size(stdClass $file, $file_limit = 0, $user_limit = 0) {
global $user;
$errors = array();
// Bypass validation for uid = 1.
if ($user->uid != 1) {
if ($file_limit && $file->filesize > $file_limit) {
$errors[] = t('The file is %filesize exceeding the maximum file size of %maxsize.', array('%filesize' => format_size($file->filesize), '%maxsize' => format_size($file_limit)));
}
// Save a query by only calling file_space_used() when a limit is provided.
if ($user_limit && (file_space_used($user->uid) + $file->filesize) > $user_limit) {
$errors[] = t('The file is %filesize which would exceed your disk quota of %quota.', array('%filesize' => format_size($file->filesize), '%quota' => format_size($user_limit)));
}
if ($file_limit && $file->filesize > $file_limit) {
$errors[] = t('The file is %filesize exceeding the maximum file size of %maxsize.', array('%filesize' => format_size($file->filesize), '%maxsize' => format_size($file_limit)));
}
// Save a query by only calling file_space_used() when a limit is provided.
if ($user_limit && (file_space_used($user->uid) + $file->filesize) > $user_limit) {
$errors[] = t('The file is %filesize which would exceed your disk quota of %quota.', array('%filesize' => format_size($file->filesize), '%quota' => format_size($user_limit)));
}
return $errors;
}
@@ -1999,23 +1994,7 @@ function file_download() {
$target = implode('/', $args);
$uri = $scheme . '://' . $target;
if (file_stream_wrapper_valid_scheme($scheme) && file_exists($uri)) {
// Let other modules provide headers and controls access to the file.
// module_invoke_all() uses array_merge_recursive() which merges header
// values into a new array. To avoid that and allow modules to override
// headers instead, use array_merge() to merge the returned arrays.
$headers = array();
foreach (module_implements('file_download') as $module) {
$function = $module . '_file_download';
$result = $function($uri);
if ($result == -1) {
// Throw away the headers received so far.
$headers = array();
break;
}
if (isset($result) && is_array($result)) {
$headers = array_merge($headers, $result);
}
}
$headers = file_download_headers($uri);
if (count($headers)) {
file_transfer($uri, $headers);
}
@@ -2027,6 +2006,69 @@ function file_download() {
drupal_exit();
}
/**
* Retrieves headers for a private file download.
*
* Calls all module implementations of hook_file_download() to retrieve headers
* for files by the module that originally provided the file. The presence of
* returned headers indicates the current user has access to the file.
*
* @param $uri
* The URI for the file whose headers should be retrieved.
*
* @return
* If access is allowed, headers for the file, suitable for passing to
* file_transfer(). If access is not allowed, an empty array will be returned.
*
* @see file_transfer()
* @see file_download_access()
* @see hook_file_downlaod()
*/
function file_download_headers($uri) {
// Let other modules provide headers and control access to the file.
// module_invoke_all() uses array_merge_recursive() which merges header
// values into a new array. To avoid that and allow modules to override
// headers instead, use array_merge() to merge the returned arrays.
$headers = array();
foreach (module_implements('file_download') as $module) {
$function = $module . '_file_download';
$result = $function($uri);
if ($result == -1) {
// Throw away the headers received so far.
$headers = array();
break;
}
if (isset($result) && is_array($result)) {
$headers = array_merge($headers, $result);
}
}
return $headers;
}
/**
* Checks that the current user has access to a particular file.
*
* The return value of this function hinges on the return value from
* file_download_headers(), which is the function responsible for collecting
* access information through hook_file_download().
*
* If immediately transferring the file to the browser and the headers will
* need to be retrieved, the return value of file_download_headers() should be
* used to determine access directly, so that access checks will not be run
* twice.
*
* @param $uri
* The URI for the file whose access should be retrieved.
*
* @return
* Boolean TRUE if access is allowed. FALSE if access is not allowed.
*
* @see file_download_headers()
* @see hook_file_download()
*/
function file_download_access($uri) {
return count(file_download_headers($uri)) > 0;
}
/**
* Finds all files that match a given mask in a given directory.
+20
View File
@@ -43,6 +43,7 @@ function file_default_mimetype_mapping() {
4 => 'application/cap',
5 => 'application/cu-seeme',
6 => 'application/dsptype',
350 => 'application/epub+zip',
7 => 'application/hta',
8 => 'application/java-archive',
9 => 'application/java-serialized-object',
@@ -64,6 +65,7 @@ function file_default_mimetype_mapping() {
25 => 'application/rss+xml',
26 => 'application/rtf',
27 => 'application/smil',
349 => 'application/vnd.amazon.ebook',
28 => 'application/vnd.cinderella',
29 => 'application/vnd.google-earth.kml+xml',
30 => 'application/vnd.google-earth.kmz',
@@ -183,6 +185,8 @@ function file_default_mimetype_mapping() {
144 => 'application/x-lzx',
145 => 'application/x-maker',
146 => 'application/x-mif',
351 => 'application/x-mobipocket-ebook',
352 => 'application/x-mobipocket-ebook',
147 => 'application/x-ms-wmd',
148 => 'application/x-ms-wmz',
149 => 'application/x-msdos-program',
@@ -228,8 +232,10 @@ function file_default_mimetype_mapping() {
188 => 'audio/mpeg',
189 => 'audio/ogg',
190 => 'audio/prs.sid',
356 => 'audio/webm',
191 => 'audio/x-aiff',
192 => 'audio/x-gsm',
354 => 'audio/x-matroska',
193 => 'audio/x-mpegurl',
194 => 'audio/x-ms-wax',
195 => 'audio/x-ms-wma',
@@ -301,6 +307,7 @@ function file_default_mimetype_mapping() {
261 => 'image/vnd.djvu',
262 => 'image/vnd.microsoft.icon',
263 => 'image/vnd.wap.wbmp',
355 => 'image/webp',
264 => 'image/x-cmu-raster',
265 => 'image/x-coreldraw',
266 => 'image/x-coreldrawpattern',
@@ -337,6 +344,7 @@ function file_default_mimetype_mapping() {
297 => 'text/vnd.sun.j2me.app-descriptor',
298 => 'text/vnd.wap.wml',
299 => 'text/vnd.wap.wmlscript',
358 => 'text/vtt',
300 => 'text/x-bibtex',
301 => 'text/x-boo',
302 => 'text/x-c++hdr',
@@ -371,9 +379,11 @@ function file_default_mimetype_mapping() {
331 => 'video/ogg',
332 => 'video/quicktime',
333 => 'video/vnd.mpegurl',
357 => 'video/webm',
347 => 'video/x-flv',
334 => 'video/x-la-asf',
348 => 'video/x-m4v',
353 => 'video/x-matroska',
335 => 'video/x-mng',
336 => 'video/x-ms-asf',
337 => 'video/x-ms-wm',
@@ -854,6 +864,16 @@ function file_default_mimetype_mapping() {
'f4b' => 346,
'flv' => 347,
'm4v' => 348,
'azw' => 349,
'epub' => 350,
'mobi' => 351,
'prc' => 352,
'mkv' => 353,
'mka' => 354,
'webp' => 355,
'weba' => 356,
'webm' => 357,
'vtt' => 358,
),
);
}
+4 -2
View File
@@ -72,7 +72,8 @@ class FileTransferSSH extends FileTransfer implements FileTransferChmodInterface
return TRUE;
}
return FALSE;
} else {
}
else {
throw new FileTransferException('Cannot check @path.', NULL, array('@path' => $path));
}
}
@@ -85,7 +86,8 @@ class FileTransferSSH extends FileTransfer implements FileTransferChmodInterface
return TRUE;
}
return FALSE;
} else {
}
else {
throw new FileTransferException('Cannot check @path.', NULL, array('@path' => $path));
}
}
+167 -29
View File
@@ -938,7 +938,7 @@ function drupal_process_form($form_id, &$form, &$form_state) {
// after the batch is processed.
}
// Set a flag to indicate the the form has been processed and executed.
// Set a flag to indicate that the form has been processed and executed.
$form_state['executed'] = TRUE;
// Redirect the form based on values in $form_state.
@@ -1128,6 +1128,17 @@ function drupal_prepare_form($form_id, &$form, &$form_state) {
drupal_alter($hooks, $form, $form_state, $form_id);
}
/**
* Helper function to call form_set_error() if there is a token error.
*/
function _drupal_invalid_token_set_form_error() {
$path = current_path();
$query = drupal_get_query_parameters();
$url = url($path, array('query' => $query));
// Setting this error will cause the form to fail validation.
form_set_error('form_token', t('The form has become outdated. Copy any unsaved work in the form below and then <a href="@link">reload this page</a>.', array('@link' => $url)));
}
/**
* Validates user-submitted form data in the $form_state array.
@@ -1162,16 +1173,11 @@ function drupal_validate_form($form_id, &$form, &$form_state) {
}
// If the session token was set by drupal_prepare_form(), ensure that it
// matches the current user's session.
// matches the current user's session. This is duplicate to code in
// form_builder() but left to protect any custom form handling code.
if (isset($form['#token'])) {
if (!drupal_valid_token($form_state['values']['form_token'], $form['#token'])) {
$path = current_path();
$query = drupal_get_query_parameters();
$url = url($path, array('query' => $query));
// Setting this error will cause the form to fail validation.
form_set_error('form_token', t('The form has become outdated. Copy any unsaved work in the form below and then <a href="@link">reload this page</a>.', array('@link' => $url)));
if (!drupal_valid_token($form_state['values']['form_token'], $form['#token']) || !empty($form_state['invalid_token'])) {
_drupal_invalid_token_set_form_error();
// Stop here and don't run any further validation handlers, because they
// could invoke non-safe operations which opens the door for CSRF
// vulnerabilities.
@@ -1827,6 +1833,20 @@ function form_builder($form_id, &$element, &$form_state) {
// from the POST data is set and matches the current form_id.
if ($form_state['programmed'] || (!empty($form_state['input']) && (isset($form_state['input']['form_id']) && ($form_state['input']['form_id'] == $form_id)))) {
$form_state['process_input'] = TRUE;
// If the session token was set by drupal_prepare_form(), ensure that it
// matches the current user's session.
$form_state['invalid_token'] = FALSE;
if (isset($element['#token'])) {
if (empty($form_state['input']['form_token']) || !drupal_valid_token($form_state['input']['form_token'], $element['#token'])) {
// Set an early form error to block certain input processing since that
// opens the door for CSRF vulnerabilities.
_drupal_invalid_token_set_form_error();
// This value is checked in _form_builder_handle_input_element().
$form_state['invalid_token'] = TRUE;
// Make sure file uploads do not get processed.
$_FILES = array();
}
}
}
else {
$form_state['process_input'] = FALSE;
@@ -1930,6 +1950,18 @@ function form_builder($form_id, &$element, &$form_state) {
$element['#attributes']['enctype'] = 'multipart/form-data';
}
// Allow Ajax submissions to the form action to bypass verification. This is
// especially useful for multipart forms, which cannot be verified via a
// response header.
$element['#attached']['js'][] = array(
'type' => 'setting',
'data' => array(
'urlIsAjaxTrusted' => array(
$element['#action'] => TRUE,
),
),
);
// If a form contains a single textfield, and the ENTER key is pressed
// within it, Internet Explorer submits the form with no POST data
// identifying any submit button. Other browsers submit POST data as though
@@ -1978,6 +2010,19 @@ function form_builder($form_id, &$element, &$form_state) {
* Adds the #name and #value properties of an input element before rendering.
*/
function _form_builder_handle_input_element($form_id, &$element, &$form_state) {
static $safe_core_value_callbacks = array(
'form_type_token_value',
'form_type_textarea_value',
'form_type_textfield_value',
'form_type_checkbox_value',
'form_type_checkboxes_value',
'form_type_radios_value',
'form_type_password_confirm_value',
'form_type_select_value',
'form_type_tableselect_value',
'list_boolean_allowed_values_callback',
);
if (!isset($element['#name'])) {
$name = array_shift($element['#parents']);
$element['#name'] = $name;
@@ -2056,7 +2101,14 @@ function _form_builder_handle_input_element($form_id, &$element, &$form_state) {
// property, optionally filtered through $value_callback.
if ($input_exists) {
if (function_exists($value_callback)) {
$element['#value'] = $value_callback($element, $input, $form_state);
// Skip all value callbacks except safe ones like text if the CSRF
// token was invalid.
if (empty($form_state['invalid_token']) || in_array($value_callback, $safe_core_value_callbacks)) {
$element['#value'] = $value_callback($element, $input, $form_state);
}
else {
$input = NULL;
}
}
if (!isset($element['#value']) && isset($input)) {
$element['#value'] = $input;
@@ -2451,6 +2503,17 @@ function form_type_password_confirm_value($element, $input = FALSE) {
$element += array('#default_value' => array());
return $element['#default_value'] + array('pass1' => '', 'pass2' => '');
}
$value = array('pass1' => '', 'pass2' => '');
// Throw out all invalid array keys; we only allow pass1 and pass2.
foreach ($value as $allowed_key => $default) {
// These should be strings, but allow other scalars since they might be
// valid input in programmatic form submissions. Any nested array values
// are ignored.
if (isset($input[$allowed_key]) && is_scalar($input[$allowed_key])) {
$value[$allowed_key] = (string) $input[$allowed_key];
}
}
return $value;
}
/**
@@ -2494,6 +2557,27 @@ function form_type_select_value($element, $input = FALSE) {
}
}
/**
* Determines the value for a textarea form element.
*
* @param array $element
* The form element whose value is being populated.
* @param mixed $input
* The incoming input to populate the form element. If this is FALSE,
* the element's default value should be returned.
*
* @return string
* The data that will appear in the $element_state['values'] collection
* for this element. Return nothing to use the default.
*/
function form_type_textarea_value($element, $input = FALSE) {
if ($input !== FALSE) {
// This should be a string, but allow other scalars since they might be
// valid input in programmatic form submissions.
return is_scalar($input) ? (string) $input : '';
}
}
/**
* Determines the value for a textfield form element.
*
@@ -2509,9 +2593,12 @@ function form_type_select_value($element, $input = FALSE) {
*/
function form_type_textfield_value($element, $input = FALSE) {
if ($input !== FALSE && $input !== NULL) {
// Equate $input to the form value to ensure it's marked for
// validation.
return str_replace(array("\r", "\n"), '', $input);
// This should be a string, but allow other scalars since they might be
// valid input in programmatic form submissions.
if (!is_scalar($input)) {
$input = '';
}
return str_replace(array("\r", "\n"), '', (string) $input);
}
}
@@ -2627,8 +2714,8 @@ function _form_options_flatten($array) {
* - #required: (optional) Whether the user needs to select an option (TRUE)
* or not (FALSE). Defaults to FALSE.
* - #empty_option: (optional) The label to show for the first default option.
* By default, the label is automatically set to "- Please select -" for a
* required field and "- None -" for an optional field.
* By default, the label is automatically set to "- Select -" for a required
* field and "- None -" for an optional field.
* - #empty_value: (optional) The value for the first default option, which is
* used to determine whether the user submitted a value or not.
* - If #required is TRUE, this defaults to '' (an empty string).
@@ -2699,17 +2786,43 @@ function theme_select($variables) {
}
/**
* Converts a select form element's options array into HTML.
* Converts an array of options into HTML, for use in select list form elements.
*
* @param $element
* An associative array containing the properties of the element.
* @param $choices
* Mixed: Either an associative array of items to list as choices, or an
* object with an 'option' member that is an associative array. This
* parameter is only used internally and should not be passed.
* This function calls itself recursively to obtain the values for each optgroup
* within the list of options and when the function encounters an object with
* an 'options' property inside $element['#options'].
*
* @return
* An HTML string of options for the select form element.
* @param array $element
* An associative array containing the following key-value pairs:
* - #multiple: Optional Boolean indicating if the user may select more than
* one item.
* - #options: An associative array of options to render as HTML. Each array
* value can be a string, an array, or an object with an 'option' property:
* - A string or integer key whose value is a translated string is
* interpreted as a single HTML option element. Do not use placeholders
* that sanitize data: doing so will lead to double-escaping. Note that
* the key will be visible in the HTML and could be modified by malicious
* users, so don't put sensitive information in it.
* - A translated string key whose value is an array indicates a group of
* options. The translated string is used as the label attribute for the
* optgroup. Do not use placeholders to sanitize data: doing so will lead
* to double-escaping. The array should contain the options you wish to
* group and should follow the syntax of $element['#options'].
* - If the function encounters a string or integer key whose value is an
* object with an 'option' property, the key is ignored, the contents of
* the option property are interpreted as $element['#options'], and the
* resulting HTML is added to the output.
* - #value: Optional integer, string, or array representing which option(s)
* to pre-select when the list is first displayed. The integer or string
* must match the key of an option in the '#options' list. If '#multiple' is
* TRUE, this can be an array of integers or strings.
* @param array|null $choices
* (optional) Either an associative array of options in the same format as
* $element['#options'] above, or NULL. This parameter is only used internally
* and is not intended to be passed in to the initial function call.
*
* @return string
* An HTML string of options and optgroups for use in a select form element.
*/
function form_select_options($element, $choices = NULL) {
if (!isset($choices)) {
@@ -2722,7 +2835,7 @@ function form_select_options($element, $choices = NULL) {
$options = '';
foreach ($choices as $key => $choice) {
if (is_array($choice)) {
$options .= '<optgroup label="' . $key . '">';
$options .= '<optgroup label="' . check_plain($key) . '">';
$options .= form_select_options($element, $choice);
$options .= '</optgroup>';
}
@@ -3285,6 +3398,8 @@ function form_process_container($element, &$form_state) {
*/
function theme_container($variables) {
$element = $variables['element'];
// Ensure #attributes is set.
$element += array('#attributes' => array());
// Special handling for form elements.
if (isset($element['#array_parents'])) {
@@ -3847,6 +3962,29 @@ function theme_hidden($variables) {
return '<input' . drupal_attributes($element['#attributes']) . " />\n";
}
/**
* Process function to prepare autocomplete data.
*
* @param $element
* A textfield or other element with a #autocomplete_path.
*
* @return array
* The processed form element.
*/
function form_process_autocomplete($element) {
$element['#autocomplete_input'] = array();
if ($element['#autocomplete_path'] && drupal_valid_path($element['#autocomplete_path'])) {
$element['#autocomplete_input']['#id'] = $element['#id'] .'-autocomplete';
// Force autocomplete to use non-clean URLs since this protects against the
// browser interpreting the path plus search string as an actual file.
$current_clean_url = isset($GLOBALS['conf']['clean_url']) ? $GLOBALS['conf']['clean_url'] : NULL;
$GLOBALS['conf']['clean_url'] = 0;
$element['#autocomplete_input']['#url_value'] = url($element['#autocomplete_path'], array('absolute' => TRUE));
$GLOBALS['conf']['clean_url'] = $current_clean_url;
}
return $element;
}
/**
* Returns HTML for a textfield form element.
*
@@ -3865,14 +4003,14 @@ function theme_textfield($variables) {
_form_set_class($element, array('form-text'));
$extra = '';
if ($element['#autocomplete_path'] && drupal_valid_path($element['#autocomplete_path'])) {
if ($element['#autocomplete_path'] && !empty($element['#autocomplete_input'])) {
drupal_add_library('system', 'drupal.autocomplete');
$element['#attributes']['class'][] = 'form-autocomplete';
$attributes = array();
$attributes['type'] = 'hidden';
$attributes['id'] = $element['#attributes']['id'] . '-autocomplete';
$attributes['value'] = url($element['#autocomplete_path'], array('absolute' => TRUE));
$attributes['id'] = $element['#autocomplete_input']['#id'];
$attributes['value'] = $element['#autocomplete_input']['#url_value'];
$attributes['disabled'] = 'disabled';
$attributes['class'][] = 'autocomplete';
$extra = '<input' . drupal_attributes($attributes) . ' />';
+7 -2
View File
@@ -362,7 +362,8 @@ function install_run_tasks(&$install_state) {
* Runs an individual installation task.
*
* @param $task
* An array of information about the task to be run.
* An array of information about the task to be run as returned by
* hook_install_tasks().
* @param $install_state
* An array of information about the current installation state. This is
* passed in by reference so that it can be modified by the task.
@@ -478,11 +479,15 @@ function install_run_task($task, &$install_state) {
* the page request evolves (for example, if an installation profile hasn't
* been selected yet, we don't yet know which profile tasks need to be run).
*
* You can override this using hook_install_tasks() or
* hook_install_tasks_alter().
*
* @param $install_state
* An array of information about the current installation state.
*
* @return
* A list of tasks to be performed, with associated metadata.
* A list of tasks to be performed, with associated metadata as returned by
* hook_install_tasks().
*/
function install_tasks_to_perform($install_state) {
// Start with a list of all currently available tasks.
+8 -1
View File
@@ -420,7 +420,7 @@ abstract class DatabaseTasks {
}
}
if (!empty($message)) {
$message = '<p>In order for Drupal to work, and to continue with the installation process, you must resolve all issues reported below. For more help with configuring your database server, see the <a href="http://drupal.org/getting-started/install">installation handbook</a>. If you are unsure what any of this means you should probably contact your hosting provider.</p>' . $message;
$message = 'Resolve all issues below to continue the installation. For help configuring your database server, see the <a href="http://drupal.org/getting-started/install">installation handbook</a>, or contact your hosting provider.' . $message;
throw new DatabaseTaskException($message);
}
}
@@ -653,6 +653,13 @@ function drupal_rewrite_settings($settings = array(), $prefix = '') {
if ($fp && fwrite($fp, $buffer) === FALSE) {
throw new Exception(st('Failed to modify %settings. Verify the file permissions.', array('%settings' => $settings_file)));
}
else {
// The existing settings.php file might have been included already. In
// case an opcode cache is enabled, the rewritten contents of the file
// will not be reflected in this process. Ensure to invalidate the file
// in case an opcode cache is enabled.
drupal_clear_opcode_cache(DRUPAL_ROOT . '/' . $settings_file);
}
}
else {
throw new Exception(st('Failed to open %settings. Verify the file permissions.', array('%settings' => $default_settings)));
+1 -1
View File
@@ -297,7 +297,7 @@ function language_negotiation_get_switch_links($type, $path) {
// Add support for WCAG 2.0's Language of Parts to add language identifiers.
// http://www.w3.org/TR/UNDERSTANDING-WCAG20/meaning-other-lang-id.html
foreach ($result as $langcode => $link) {
$result[$langcode]['attributes']['lang'] = $langcode;
$result[$langcode]['attributes']['xml:lang'] = $langcode;
}
if (!empty($result)) {
+10 -5
View File
@@ -398,7 +398,7 @@ function locale_language_switcher_session($type, $path) {
$links[$langcode]['query'][$param] = $langcode;
}
else {
$links[$langcode]['attributes']['class'][] = ' session-active';
$links[$langcode]['attributes']['class'][] = 'session-active';
}
}
@@ -1931,7 +1931,7 @@ function _locale_translate_seek() {
$groups[$string['group']],
array('data' => check_plain(truncate_utf8($string['source'], 150, FALSE, TRUE)) . '<br /><small>' . $string['location'] . '</small>'),
$string['context'],
array('data' => _locale_translate_language_list($string['languages'], $limit_language), 'align' => 'center'),
array('data' => _locale_translate_language_list($string, $limit_language), 'align' => 'center'),
array('data' => l(t('edit'), "admin/config/regional/translate/edit/$lid", array('query' => drupal_get_destination())), 'class' => array('nowrap')),
array('data' => l(t('delete'), "admin/config/regional/translate/delete/$lid", array('query' => drupal_get_destination())), 'class' => array('nowrap')),
);
@@ -2126,16 +2126,21 @@ function _locale_rebuild_js($langcode = NULL) {
/**
* List languages in search result table
*/
function _locale_translate_language_list($translation, $limit_language) {
function _locale_translate_language_list($string, $limit_language) {
// Add CSS.
drupal_add_css(drupal_get_path('module', 'locale') . '/locale.css');
// Include both translated and not yet translated target languages in the
// list. The source language is English for built-in strings and the default
// language for other strings.
$languages = language_list();
unset($languages['en']);
$default = language_default();
$omit = $string['group'] == 'default' ? 'en' : $default->language;
unset($languages[$omit]);
$output = '';
foreach ($languages as $langcode => $language) {
if (!$limit_language || $limit_language == $langcode) {
$output .= (!empty($translation[$langcode])) ? $langcode . ' ' : "<em class=\"locale-untranslated\">$langcode</em> ";
$output .= (!empty($string['languages'][$langcode])) ? $langcode . ' ' : "<em class=\"locale-untranslated\">$langcode</em> ";
}
}
+1 -1
View File
@@ -92,7 +92,7 @@ function _lock_id() {
* Acquire (or renew) a lock, but do not block if it fails.
*
* @param $name
* The name of the lock.
* The name of the lock. Limit of name's length is 255 characters.
* @param $timeout
* A number of seconds (float) before the lock expires (minimum of 0.001).
*
+1 -1
View File
@@ -10,7 +10,7 @@
*
* $conf['mail_line_endings'] will override this setting.
*/
define('MAIL_LINE_ENDINGS', isset($_SERVER['WINDIR']) || strpos($_SERVER['SERVER_SOFTWARE'], 'Win32') !== FALSE ? "\r\n" : "\n");
define('MAIL_LINE_ENDINGS', isset($_SERVER['WINDIR']) || (isset($_SERVER['SERVER_SOFTWARE']) && strpos($_SERVER['SERVER_SOFTWARE'], 'Win32') !== FALSE) ? "\r\n" : "\n");
/**
* Composes and optionally sends an e-mail message.
+34 -2
View File
@@ -456,7 +456,9 @@ function menu_get_item($path = NULL, $router_item = NULL) {
// Rebuild if we know it's needed, or if the menu masks are missing which
// occurs rarely, likely due to a race condition of multiple rebuilds.
if (variable_get('menu_rebuild_needed', FALSE) || !variable_get('menu_masks', array())) {
menu_rebuild();
if (_menu_check_rebuild()) {
menu_rebuild();
}
}
$original_map = arg(NULL, $path);
@@ -1485,7 +1487,7 @@ function menu_tree_collect_node_links(&$tree, &$node_links) {
* menu_tree_collect_node_links().
*/
function menu_tree_check_access(&$tree, $node_links = array()) {
if ($node_links) {
if ($node_links && (user_access('access content') || user_access('bypass node access'))) {
$nids = array_keys($node_links);
$select = db_select('node', 'n');
$select->addField('n', 'nid');
@@ -2495,6 +2497,7 @@ function menu_link_get_preferred($path = NULL, $selected_menu = NULL) {
$query->addField('ml', 'weight', 'link_weight');
$query->fields('m');
$query->condition('ml.link_path', $path_candidates, 'IN');
$query->addTag('preferred_menu_links');
// Sort candidates by link path and menu name.
$candidates = array();
@@ -2692,6 +2695,21 @@ function menu_reset_static_cache() {
drupal_static_reset('menu_link_get_preferred');
}
/**
* Checks whether a menu_rebuild() is necessary.
*/
function _menu_check_rebuild() {
// To absolutely ensure that the menu rebuild is required, re-load the
// variables in case they were set by another process.
$variables = variable_initialize();
if (empty($variables['menu_rebuild_needed']) && !empty($variables['menu_masks'])) {
unset($GLOBALS['conf']['menu_rebuild_needed']);
$GLOBALS['conf']['menu_masks'] = $variables['menu_masks'];
return FALSE;
}
return TRUE;
}
/**
* Populates the database tables used by various menu functions.
*
@@ -2712,6 +2730,14 @@ function menu_rebuild() {
// We choose to block here since otherwise the router item may not
// be available in menu_execute_active_handler() resulting in a 404.
lock_wait('menu_rebuild');
if (_menu_check_rebuild()) {
// If we get here and menu_masks was not set, then it is possible a menu
// is being reloaded, or that the process rebuilding the menu was unable
// to complete successfully. A missing menu_masks variable could result
// in a 404, so re-run the function.
return menu_rebuild();
}
return FALSE;
}
@@ -2736,6 +2762,12 @@ function menu_rebuild() {
$transaction->rollback();
watchdog_exception('menu', $e);
}
// Explicitly commit the transaction now; this ensures that the database
// operations during the menu rebuild are committed before the lock is made
// available again, since locks may not always reside in the same database
// connection. The lock is acquired outside of the transaction so should also
// be released outside of it.
unset($transaction);
lock_release('menu_rebuild');
return TRUE;
+3 -3
View File
@@ -265,11 +265,11 @@ function _module_build_dependencies($files) {
/**
* Determines whether a given module exists.
*
* @param $module
* @param string $module
* The name of the module (without the .module extension).
*
* @return
* TRUE if the module is both installed and enabled.
* @return bool
* TRUE if the module is both installed and enabled, FALSE otherwise.
*/
function module_exists($module) {
$list = module_list();
+5 -1
View File
@@ -140,7 +140,7 @@ function _password_enforce_log2_boundaries($count_log2) {
* @param $algo
* The string name of a hashing algorithm usable by hash(), like 'sha256'.
* @param $password
* The plain-text password to hash.
* Plain-text password up to 512 bytes (128 to 512 UTF-8 characters) to hash.
* @param $setting
* An existing hash or the output of _password_generate_salt(). Must be
* at least 12 characters (the settings and salt).
@@ -150,6 +150,10 @@ function _password_enforce_log2_boundaries($count_log2) {
* The return string will be truncated at DRUPAL_HASH_LENGTH characters max.
*/
function _password_crypt($algo, $password, $setting) {
// Prevent DoS attacks by refusing to hash large passwords.
if (strlen($password) > 512) {
return FALSE;
}
// The first 12 characters of an existing hash are its setting string.
$setting = substr($setting, 0, 12);
+1 -1
View File
@@ -79,7 +79,7 @@ function _drupal_session_read($sid) {
// Handle the case of first time visitors and clients that don't store
// cookies (eg. web crawlers).
$insecure_session_name = substr(session_name(), 1);
if (!isset($_COOKIE[session_name()]) && !isset($_COOKIE[$insecure_session_name])) {
if (empty($sid) || (!isset($_COOKIE[session_name()]) && !isset($_COOKIE[$insecure_session_name]))) {
$user = drupal_anonymous_user();
return '';
}
+3 -4
View File
@@ -46,10 +46,9 @@ class TableSort extends SelectQueryExtender {
// Based on code from db_escape_table(), but this can also contain a dot.
$field = preg_replace('/[^A-Za-z0-9_.]+/', '', $ts['sql']);
// Sort order can only be ASC or DESC.
$sort = drupal_strtoupper($ts['sort']);
$sort = in_array($sort, array('ASC', 'DESC')) ? $sort : '';
$this->orderBy($field, $sort);
// orderBy() will ensure that only ASC/DESC values are accepted, so we
// don't need to sanitize that here.
$this->orderBy($field, $ts['sort']);
}
return $this;
}
+79 -4
View File
@@ -1029,6 +1029,7 @@ function theme($hook, $variables = array()) {
}
$hook = $candidate;
}
$theme_hook_original = $hook;
// If there's no implementation, check for more generic fallbacks. If there's
// still no implementation, log an error and return an empty string.
@@ -1090,6 +1091,8 @@ function theme($hook, $variables = array()) {
$variables += array($info['render element'] => array());
}
$variables['theme_hook_original'] = $theme_hook_original;
// Invoke the variable processors, if any. The processors may specify
// alternate suggestions for which hook's template/function to use. If the
// hook is a suggestion of a base hook, invoke the variable processors of
@@ -1198,7 +1201,12 @@ function theme($hook, $variables = array()) {
if (isset($info['path'])) {
$template_file = $info['path'] . '/' . $template_file;
}
$output = $render_function($template_file, $variables);
if (variable_get('theme_debug', FALSE)) {
$output = _theme_render_template_debug($render_function, $template_file, $variables, $extension);
}
else {
$output = $render_function($template_file, $variables);
}
}
// restore path_to_theme()
@@ -1520,6 +1528,72 @@ function theme_render_template($template_file, $variables) {
return ob_get_clean();
}
/**
* Renders a template for any engine.
*
* Includes the possibility to get debug output by setting the
* theme_debug variable to TRUE.
*
* @param string $template_function
* The function to call for rendering the template.
* @param string $template_file
* The filename of the template to render.
* @param array $variables
* A keyed array of variables that will appear in the output.
* @param string $extension
* The extension used by the theme engine for template files.
*
* @return string
* The output generated by the template including debug information.
*/
function _theme_render_template_debug($template_function, $template_file, $variables, $extension) {
$output = array(
'debug_prefix' => '',
'debug_info' => '',
'rendered_markup' => call_user_func($template_function, $template_file, $variables),
'debug_suffix' => '',
);
$output['debug_prefix'] .= "\n\n<!-- THEME DEBUG -->";
$output['debug_prefix'] .= "\n<!-- CALL: theme('" . check_plain($variables['theme_hook_original']) . "') -->";
// If there are theme suggestions, reverse the array so more specific
// suggestions are shown first.
if (!empty($variables['theme_hook_suggestions'])) {
$variables['theme_hook_suggestions'] = array_reverse($variables['theme_hook_suggestions']);
}
// Add debug output for directly called suggestions like
// '#theme' => 'comment__node__article'.
if (strpos($variables['theme_hook_original'], '__') !== FALSE) {
$derived_suggestions[] = $hook = $variables['theme_hook_original'];
while ($pos = strrpos($hook, '__')) {
$hook = substr($hook, 0, $pos);
$derived_suggestions[] = $hook;
}
// Get the value of the base hook (last derived suggestion) and append it
// to the end of all theme suggestions.
$base_hook = array_pop($derived_suggestions);
$variables['theme_hook_suggestions'] = array_merge($derived_suggestions, $variables['theme_hook_suggestions']);
$variables['theme_hook_suggestions'][] = $base_hook;
}
if (!empty($variables['theme_hook_suggestions'])) {
$current_template = basename($template_file);
$suggestions = $variables['theme_hook_suggestions'];
// Only add the original theme hook if it wasn't a directly called
// suggestion.
if (strpos($variables['theme_hook_original'], '__') === FALSE) {
$suggestions[] = $variables['theme_hook_original'];
}
foreach ($suggestions as &$suggestion) {
$template = strtr($suggestion, '_', '-') . $extension;
$prefix = ($template == $current_template) ? 'x' : '*';
$suggestion = $prefix . ' ' . $template;
}
$output['debug_info'] .= "\n<!-- FILE NAME SUGGESTIONS:\n " . check_plain(implode("\n ", $suggestions)) . "\n-->";
}
$output['debug_info'] .= "\n<!-- BEGIN OUTPUT from '" . check_plain($template_file) . "' -->\n";
$output['debug_suffix'] .= "\n<!-- END OUTPUT from '" . check_plain($template_file) . "' -->\n\n";
return implode('', $output);
}
/**
* Enables a given list of themes.
*
@@ -1617,7 +1691,7 @@ function theme_status_messages($variables) {
$output .= " </ul>\n";
}
else {
$output .= $messages[0];
$output .= reset($messages);
}
$output .= "</div>\n";
}
@@ -1690,8 +1764,6 @@ function theme_links($variables) {
$output = '';
if (count($links) > 0) {
$output = '';
// Treat the heading first if it is present to prepend it to the
// list of links.
if (!empty($heading)) {
@@ -2550,6 +2622,9 @@ function template_preprocess_page(&$variables) {
if (!isset($variables['page'][$region_key])) {
$variables['page'][$region_key] = array();
}
if ($region_content = drupal_get_region_content($region_key)) {
$variables['page'][$region_key][]['#markup'] = $region_content;
}
}
// Set up layout variable.
+9 -5
View File
@@ -116,11 +116,15 @@ function _unicode_check() {
if (ini_get('mbstring.encoding_translation') != 0) {
return array(UNICODE_ERROR, $t('Multibyte string input conversion in PHP is active and must be disabled. Check the php.ini <em>mbstring.encoding_translation</em> setting. Please refer to the <a href="@url">PHP mbstring documentation</a> for more information.', array('@url' => 'http://www.php.net/mbstring')));
}
if (ini_get('mbstring.http_input') != 'pass') {
return array(UNICODE_ERROR, $t('Multibyte string input conversion in PHP is active and must be disabled. Check the php.ini <em>mbstring.http_input</em> setting. Please refer to the <a href="@url">PHP mbstring documentation</a> for more information.', array('@url' => 'http://www.php.net/mbstring')));
}
if (ini_get('mbstring.http_output') != 'pass') {
return array(UNICODE_ERROR, $t('Multibyte string output conversion in PHP is active and must be disabled. Check the php.ini <em>mbstring.http_output</em> setting. Please refer to the <a href="@url">PHP mbstring documentation</a> for more information.', array('@url' => 'http://www.php.net/mbstring')));
// mbstring.http_input and mbstring.http_output are deprecated and empty by
// default in PHP 5.6.
if (version_compare(PHP_VERSION, '5.6.0') == -1) {
if (ini_get('mbstring.http_input') != 'pass') {
return array(UNICODE_ERROR, $t('Multibyte string input conversion in PHP is active and must be disabled. Check the php.ini <em>mbstring.http_input</em> setting. Please refer to the <a href="@url">PHP mbstring documentation</a> for more information.', array('@url' => 'http://www.php.net/mbstring')));
}
if (ini_get('mbstring.http_output') != 'pass') {
return array(UNICODE_ERROR, $t('Multibyte string output conversion in PHP is active and must be disabled. Check the php.ini <em>mbstring.http_output</em> setting. Please refer to the <a href="@url">PHP mbstring documentation</a> for more information.', array('@url' => 'http://www.php.net/mbstring')));
}
}
// Set appropriate configuration
+35 -1
View File
@@ -178,7 +178,41 @@ function xmlrpc_message_parse($xmlrpc_message) {
xml_set_element_handler($xmlrpc_message->_parser, 'xmlrpc_message_tag_open', 'xmlrpc_message_tag_close');
xml_set_character_data_handler($xmlrpc_message->_parser, 'xmlrpc_message_cdata');
xmlrpc_message_set($xmlrpc_message);
if (!xml_parse($xmlrpc_message->_parser, $xmlrpc_message->message)) {
// Strip XML declaration.
$header = preg_replace('/<\?xml.*?\?'.'>/s', '', substr($xmlrpc_message->message, 0, 100), 1);
$xml = trim(substr_replace($xmlrpc_message->message, $header, 0, 100));
if ($xml == '') {
return FALSE;
}
// Strip DTD.
$header = preg_replace('/^<!DOCTYPE[^>]*+>/i', '', substr($xml, 0, 200), 1);
$xml = trim(substr_replace($xml, $header, 0, 200));
if ($xml == '') {
return FALSE;
}
// Confirm the XML now starts with a valid root tag. A root tag can end in [> \t\r\n]
$root_tag = substr($xml, 0, strcspn(substr($xml, 0, 20), "> \t\r\n"));
// Reject a second DTD.
if (strtoupper($root_tag) == '<!DOCTYPE') {
return FALSE;
}
if (!in_array($root_tag, array('<methodCall', '<methodResponse', '<fault'))) {
return FALSE;
}
// Skip parsing if there is an unreasonably large number of tags.
try {
$dom = new DOMDocument();
@$dom->loadXML($xml);
if ($dom->getElementsByTagName('*')->length > variable_get('xmlrpc_message_maximum_tag_count', 30000)) {
return FALSE;
}
}
catch (Exception $e) {
return FALSE;
}
if (!xml_parse($xmlrpc_message->_parser, $xml)) {
return FALSE;
}
xml_parser_free($xmlrpc_message->_parser);
+3 -1
View File
@@ -9,7 +9,9 @@
* Invokes XML-RPC methods on this server.
*
* @param array $callbacks
* Array of external XML-RPC method names with the callbacks they map to.
* Either an associative array of external XML-RPC method names as keys with
* the callbacks they map to as values, or a more complex structure
* describing XML-RPC callbacks as returned from hook_xmlrpc().
*/
function xmlrpc_server($callbacks) {
$xmlrpc_server = new stdClass();
+16 -16
View File
@@ -8,14 +8,14 @@
<html class="js no-flexbox canvas canvastext webgl no-touch geolocation postmessage no-websqldatabase indexeddb hashchange history draganddrop websockets rgba hsla multiplebgs backgroundsize borderimage borderradius boxshadow textshadow opacity cssanimations csscolumns cssgradients no-cssreflections csstransforms csstransforms3d csstransitions fontface generatedcontent video audio localstorage sessionstorage webworkers applicationcache svg inlinesvg smil svgclippaths" dir="ltr" lang="en"><!--<![endif]-->
<head>
<!-- Always force latest IE rendering engine (even in intranet) & Chrome Frame
<!-- Always force latest IE rendering engine (even in intranet) & Chrome Frame
Remove this if you use the .htaccess -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<link type="image/png" rel="shortcut icon" href="http://www.materio.com/sites/all/themes/gui/materiobasetheme/materio-icon-O.png">
<link type="image/png" rel="shortcut icon" href="http://www.materio.com/sites/all/themes/gui/materiobasetheme/materio-icon-O.png">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="alternate" type="application/rss+xml" title="Materio's news" href="http://www.materio.com/en/rss/feed">
<title>Site under maintenance | materiO</title>
<style type="text/css" media="all">
@import url("http://www.materio.com/modules/system/system.base.css?mu8p7n");
@@ -37,45 +37,45 @@
@import url("http://www.materio.com/sites/all/themes/gui/materiobasetheme/css/nonsemantic.css?mu8p7n");
</style>
<!-- All JavaScript at the bottom, except for Modernizr / Respond.
<!--[if lt IE 9]><script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
</head>
<body class="maintenance-page in-maintenance no-sidebars">
<div id="root">
<div id="container">
<div id="container">
<header id="header">
<h1 class="site-name">materiO</h1>
<h2 class="site-slogan">l'inspiration par la matière </h2>
</header>
</header>
<div id="main">
<section id="center">
<section id="center">
<section id="content">
<div class="inner-content">
<h3 class="page-title">Site under maintenance</h3> <p>materiO' is currently working hard to make a better service for you !<br>We should be back shortly.<br>Thank you for your patience.</p>
<img src="index_files/maintenance.jpg">
<img src="index_files/maintenance.jpg">
</div>
</section>
</section> <!-- /center -->
</div><!-- /main -->
</div><!-- /main -->
<div id="footer"></div>
</div>
</div>
<!-- /container -->
</div>
<!-- /root -->
<div style="display: none;" id="cboxOverlay"></div><div style="display: none;" tabindex="-1" role="dialog" class="" id="colorbox"><div id="cboxWrapper"><div><div style="float: left;" id="cboxTopLeft"></div><div style="float: left;" id="cboxTopCenter"></div><div style="float: left;" id="cboxTopRight"></div></div><div style="clear: left;"><div style="float: left;" id="cboxMiddleLeft"></div><div style="float: left;" id="cboxContent"><div style="float: left;" id="cboxTitle"></div><div style="float: left;" id="cboxCurrent"></div><button id="cboxPrevious" type="button"></button><button id="cboxNext" type="button"></button><button id="cboxSlideshow"></button><div style="float: left;" id="cboxLoadingOverlay"></div><div style="float: left;" id="cboxLoadingGraphic"></div><button id="cboxClose" type="button"></button></div><div style="float: left;" id="cboxMiddleRight"></div></div><div style="clear: left;"><div style="float: left;" id="cboxBottomLeft"></div><div style="float: left;" id="cboxBottomCenter"></div><div style="float: left;" id="cboxBottomRight"></div></div></div><div style="position: absolute; width: 9999px; visibility: hidden; display: none;"></div></div></body></html>
+55 -7
View File
@@ -14,6 +14,8 @@
Drupal.ajax = Drupal.ajax || {};
Drupal.settings.urlIsAjaxTrusted = Drupal.settings.urlIsAjaxTrusted || {};
/**
* Attaches the Ajax behavior to each Ajax form element.
*/
@@ -130,6 +132,11 @@ Drupal.ajax = function (base, element, element_settings) {
// 5. /nojs# - Followed by a fragment.
// E.g.: path/nojs#myfragment
this.url = element_settings.url.replace(/\/nojs(\/|$|\?|&|#)/g, '/ajax$1');
// If the 'nojs' version of the URL is trusted, also trust the 'ajax' version.
if (Drupal.settings.urlIsAjaxTrusted[element_settings.url]) {
Drupal.settings.urlIsAjaxTrusted[this.url] = true;
}
this.wrapper = '#' + element_settings.wrapper;
// If there isn't a form, jQuery.ajax() will be used instead, allowing us to
@@ -155,18 +162,36 @@ Drupal.ajax = function (base, element, element_settings) {
ajax.ajaxing = true;
return ajax.beforeSend(xmlhttprequest, options);
},
success: function (response, status) {
success: function (response, status, xmlhttprequest) {
// Sanity check for browser support (object expected).
// When using iFrame uploads, responses must be returned as a string.
if (typeof response == 'string') {
response = $.parseJSON(response);
}
// Prior to invoking the response's commands, verify that they can be
// trusted by checking for a response header. See
// ajax_set_verification_header() for details.
// - Empty responses are harmless so can bypass verification. This avoids
// an alert message for server-generated no-op responses that skip Ajax
// rendering.
// - Ajax objects with trusted URLs (e.g., ones defined server-side via
// #ajax) can bypass header verification. This is especially useful for
// Ajax with multipart forms. Because IFRAME transport is used, the
// response headers cannot be accessed for verification.
if (response !== null && !Drupal.settings.urlIsAjaxTrusted[ajax.url]) {
if (xmlhttprequest.getResponseHeader('X-Drupal-Ajax-Token') !== '1') {
var customMessage = Drupal.t("The response failed verification so will not be processed.");
return ajax.error(xmlhttprequest, ajax.url, customMessage);
}
}
return ajax.success(response, status);
},
complete: function (response, status) {
complete: function (xmlhttprequest, status) {
ajax.ajaxing = false;
if (status == 'error' || status == 'parsererror') {
return ajax.error(response, ajax.url);
return ajax.error(xmlhttprequest, ajax.url);
}
},
dataType: 'json',
@@ -175,6 +200,9 @@ Drupal.ajax = function (base, element, element_settings) {
// Bind the ajaxSubmit function to the element event.
$(ajax.element).bind(element_settings.event, function (event) {
if (!Drupal.settings.urlIsAjaxTrusted[ajax.url] && !Drupal.urlIsLocal(ajax.url)) {
throw new Error(Drupal.t('The callback URL is not local and not trusted: !url', {'!url': ajax.url}));
}
return ajax.eventResponse(this, event);
});
@@ -348,7 +376,7 @@ Drupal.ajax.prototype.beforeSend = function (xmlhttprequest, options) {
// this is only needed for IFRAME submissions.
var v = $.fieldValue(this.element);
if (v !== null) {
options.extraData[this.element.name] = v;
options.extraData[this.element.name] = Drupal.checkPlain(v);
}
}
@@ -447,8 +475,8 @@ Drupal.ajax.prototype.getEffect = function (response) {
/**
* Handler for the form redirection error.
*/
Drupal.ajax.prototype.error = function (response, uri) {
alert(Drupal.ajaxError(response, uri));
Drupal.ajax.prototype.error = function (xmlhttprequest, uri, customMessage) {
alert(Drupal.ajaxError(xmlhttprequest, uri, customMessage));
// Remove the progress element.
if (this.progress.element) {
$(this.progress.element).remove();
@@ -462,7 +490,7 @@ Drupal.ajax.prototype.error = function (response, uri) {
$(this.element).removeClass('progress-disabled').removeAttr('disabled');
// Reattach behaviors, if they were detached in beforeSerialize().
if (this.form) {
var settings = response.settings || this.settings || Drupal.settings;
var settings = this.settings || Drupal.settings;
Drupal.attachBehaviors(this.form, settings);
}
};
@@ -618,6 +646,26 @@ Drupal.ajax.prototype.commands = {
.filter(':odd').addClass('even');
},
/**
* Command to add css.
*
* Uses the proprietary addImport method if available as browsers which
* support that method ignore @import statements in dynamically added
* stylesheets.
*/
add_css: function (ajax, response, status) {
// Add the styles in the normal way.
$('head').prepend(response.data);
// Add imports in the styles using the addImport method if available.
var match, importMatch = /^@import url\("(.*)"\);$/igm;
if (document.styleSheets[0].addImport && importMatch.test(response.data)) {
importMatch.lastIndex = 0;
while (match = importMatch.exec(response.data)) {
document.styleSheets[0].addImport(match[1]);
}
}
},
/**
* Command to update a form's build ID.
*/
+5 -2
View File
@@ -271,8 +271,11 @@ Drupal.ACDB.prototype.search = function (searchString) {
var db = this;
this.searchString = searchString;
// See if this string needs to be searched for anyway.
searchString = searchString.replace(/^\s+|\s+$/, '');
// See if this string needs to be searched for anyway. The pattern ../ is
// stripped since it may be misinterpreted by the browser.
searchString = searchString.replace(/^\s+|\.{2,}\/|\s+$/g, '');
// Skip empty search strings, or search strings ending with a comma, since
// that is the separator between search terms.
if (searchString.length <= 0 ||
searchString.charAt(searchString.length - 1) == ',') {
return;
+71 -2
View File
@@ -269,6 +269,72 @@ Drupal.formatPlural = function (count, singular, plural, args, options) {
}
};
/**
* Returns the passed in URL as an absolute URL.
*
* @param url
* The URL string to be normalized to an absolute URL.
*
* @return
* The normalized, absolute URL.
*
* @see https://github.com/angular/angular.js/blob/v1.4.4/src/ng/urlUtils.js
* @see https://grack.com/blog/2009/11/17/absolutizing-url-in-javascript
* @see https://github.com/jquery/jquery-ui/blob/1.11.4/ui/tabs.js#L53
*/
Drupal.absoluteUrl = function (url) {
var urlParsingNode = document.createElement('a');
// Decode the URL first; this is required by IE <= 6. Decoding non-UTF-8
// strings may throw an exception.
try {
url = decodeURIComponent(url);
} catch (e) {}
urlParsingNode.setAttribute('href', url);
// IE <= 7 normalizes the URL when assigned to the anchor node similar to
// the other browsers.
return urlParsingNode.cloneNode(false).href;
};
/**
* Returns true if the URL is within Drupal's base path.
*
* @param url
* The URL string to be tested.
*
* @return
* Boolean true if local.
*
* @see https://github.com/jquery/jquery-ui/blob/1.11.4/ui/tabs.js#L58
*/
Drupal.urlIsLocal = function (url) {
// Always use browser-derived absolute URLs in the comparison, to avoid
// attempts to break out of the base path using directory traversal.
var absoluteUrl = Drupal.absoluteUrl(url);
var protocol = location.protocol;
// Consider URLs that match this site's base URL but use HTTPS instead of HTTP
// as local as well.
if (protocol === 'http:' && absoluteUrl.indexOf('https:') === 0) {
protocol = 'https:';
}
var baseUrl = protocol + '//' + location.host + Drupal.settings.basePath.slice(0, -1);
// Decoding non-UTF-8 strings may throw an exception.
try {
absoluteUrl = decodeURIComponent(absoluteUrl);
} catch (e) {}
try {
baseUrl = decodeURIComponent(baseUrl);
} catch (e) {}
// The given URL matches the site's base URL, or has a path under the site's
// base URL.
return absoluteUrl === baseUrl || absoluteUrl.indexOf(baseUrl + '/') === 0;
};
/**
* Generate the themed representation of a Drupal object.
*
@@ -350,7 +416,7 @@ Drupal.getSelection = function (element) {
/**
* Build an error message from an Ajax response.
*/
Drupal.ajaxError = function (xmlhttp, uri) {
Drupal.ajaxError = function (xmlhttp, uri, customMessage) {
var statusCode, statusText, pathText, responseText, readyStateText, message;
if (xmlhttp.status) {
statusCode = "\n" + Drupal.t("An AJAX HTTP error occurred.") + "\n" + Drupal.t("HTTP Result Code: !status", {'!status': xmlhttp.status});
@@ -383,7 +449,10 @@ Drupal.ajaxError = function (xmlhttp, uri) {
// We don't need readyState except for status == 0.
readyStateText = xmlhttp.status == 0 ? ("\n" + Drupal.t("ReadyState: !readyState", {'!readyState': xmlhttp.readyState})) : "";
message = statusCode + pathText + statusText + responseText + readyStateText;
// Additional message beyond what the xmlhttp object provides.
customMessage = customMessage ? ("\n" + Drupal.t("CustomMessage: !customMessage", {'!customMessage': customMessage})) : "";
message = statusCode + pathText + statusText + customMessage + responseText + readyStateText;
return message;
};
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

+1 -1
View File
@@ -500,7 +500,7 @@ Drupal.tableDrag.prototype.dragRow = function (event, self) {
if (self.indentEnabled) {
var xDiff = self.currentMouseCoords.x - self.dragObject.indentMousePos.x;
// Set the number of indentations the mouse has been moved left or right.
var indentDiff = Math.round(xDiff / self.indentAmount * self.rtl);
var indentDiff = Math.round(xDiff / self.indentAmount);
// Indent the row with our estimated diff, which may be further
// restricted according to the rows around this row.
var indentChange = self.rowObject.indent(indentDiff);
+5 -1
View File
@@ -57,10 +57,14 @@ Drupal.tableSelect = function () {
// Keep track of the last checked checkbox.
lastChecked = e.target;
});
// If all checkboxes are checked on page load, make sure the select-all one
// is checked too, otherwise keep unchecked.
updateSelectAll((checkboxes.length == $(checkboxes).filter(':checked').length));
};
Drupal.tableSelectRange = function (from, to, state) {
// We determine the looping mode based on the the order of from and to.
// We determine the looping mode based on the order of from and to.
var mode = from.rowIndex > to.rowIndex ? 'previousSibling' : 'nextSibling';
// Traverse through the sibling nodes.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 B

+6
View File
@@ -134,6 +134,8 @@ Drupal.verticalTab.prototype = {
tabShow: function () {
// Display the tab.
this.item.show();
// Show the vertical tabs.
this.item.closest('.vertical-tabs').show();
// Update .first marker for items. We need recurse from parent to retain the
// actual DOM element order as jQuery implements sortOrder, but not as public
// method.
@@ -164,6 +166,10 @@ Drupal.verticalTab.prototype = {
if ($firstTab.length) {
$firstTab.data('verticalTab').focus();
}
// Hide the vertical tabs (if no tabs remain).
else {
this.item.closest('.vertical-tabs').hide();
}
return this;
}
};
+1 -1
View File
@@ -27,7 +27,7 @@ function aggregator_aggregator_fetch($feed) {
$headers['If-None-Match'] = $feed->etag;
}
if ($feed->modified) {
$headers['If-Modified-Since'] = gmdate(DATE_RFC1123, $feed->modified);
$headers['If-Modified-Since'] = gmdate(DATE_RFC7231, $feed->modified);
}
// Request feed.
+3 -3
View File
@@ -7,8 +7,8 @@ files[] = aggregator.test
configure = admin/config/services/aggregator/settings
stylesheets[all][] = aggregator.css
; Information added by Drupal.org packaging script on 2014-05-08
version = "7.28"
; Information added by Drupal.org packaging script on 2015-08-19
version = "7.39"
project = "drupal"
datestamp = "1399522731"
datestamp = "1440020197"
@@ -5,8 +5,8 @@ version = VERSION
core = 7.x
hidden = TRUE
; Information added by Drupal.org packaging script on 2014-05-08
version = "7.28"
; Information added by Drupal.org packaging script on 2015-08-19
version = "7.39"
project = "drupal"
datestamp = "1399522731"
datestamp = "1440020197"
@@ -32,7 +32,7 @@ function aggregator_test_feed($use_last_modified = FALSE, $use_etag = FALSE) {
// Send appropriate response. We respond with a 304 not modified on either
// etag or on last modified.
if ($use_last_modified) {
drupal_add_http_header('Last-Modified', gmdate(DATE_RFC1123, $last_modified));
drupal_add_http_header('Last-Modified', gmdate(DATE_RFC7231, $last_modified));
}
if ($use_etag) {
drupal_add_http_header('ETag', $etag);
+1 -1
View File
@@ -272,7 +272,7 @@ function block_admin_configure($form, &$form_state, $module, $delta) {
$form['settings']['title'] = array(
'#type' => 'textfield',
'#title' => t('Block title'),
'#maxlength' => 64,
'#maxlength' => 255,
'#description' => $block->module == 'block' ? t('The title of the block as shown to the user.') : t('Override the default title for the block. Use <em>!placeholder</em> to display no title, or leave blank to use the default block title.', array('!placeholder' => '&lt;none&gt;')),
'#default_value' => isset($block->title) ? $block->title : '',
'#weight' => -19,
+3 -3
View File
@@ -6,8 +6,8 @@ core = 7.x
files[] = block.test
configure = admin/structure/block
; Information added by Drupal.org packaging script on 2014-05-08
version = "7.28"
; Information added by Drupal.org packaging script on 2015-08-19
version = "7.39"
project = "drupal"
datestamp = "1399522731"
datestamp = "1440020197"
+17 -1
View File
@@ -79,7 +79,7 @@ function block_schema() {
),
'title' => array(
'type' => 'varchar',
'length' => 64,
'length' => 255,
'not null' => TRUE,
'default' => '',
'description' => 'Custom title for the block. (Empty string will use block default title, <none> will remove the title, text will cause block to use specified title.)',
@@ -472,6 +472,22 @@ function block_update_7008() {
db_drop_field('block', 'throttle');
}
/**
* Increase {block}.title length to 255 characters.
*/
function block_update_7009() {
db_change_field('block', 'title', 'title',
array(
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'default' => '',
'description' => 'Custom title for the block. (Empty string will use block default title, <none> will remove the title, text will cause block to use specified title.)',
'translatable' => TRUE,
)
);
}
/**
* @} End of "addtogroup updates-7.x-extra".
*/
+19 -7
View File
@@ -66,7 +66,7 @@ function block_help($path, $arg) {
$demo_theme = !empty($arg[4]) ? $arg[4] : variable_get('theme_default', 'bartik');
$themes = list_themes();
$output = '<p>' . t('This page provides a drag-and-drop interface for assigning a block to a region, and for controlling the order of blocks within regions. Since not all themes implement the same regions, or display regions in the same way, blocks are positioned on a per-theme basis. Remember that your changes will not be saved until you click the <em>Save blocks</em> button at the bottom of the page. Click the <em>configure</em> link next to each block to configure its specific title and visibility settings.') . '</p>';
$output .= '<p>' . l(t('Demonstrate block regions (@theme)', array('@theme' => $themes[$demo_theme]->info['name'])), 'admin/structure/block/demo/' . $demo_theme) . '</p>';
$output .= '<p>' . l(t('Demonstrate block regions (!theme)', array('!theme' => $themes[$demo_theme]->info['name'])), 'admin/structure/block/demo/' . $demo_theme) . '</p>';
return $output;
}
}
@@ -143,7 +143,7 @@ function block_menu() {
);
foreach (list_themes() as $key => $theme) {
$items['admin/structure/block/list/' . $key] = array(
'title' => check_plain($theme->info['name']),
'title' => $theme->info['name'],
'page arguments' => array($key),
'type' => $key == $default_theme ? MENU_DEFAULT_LOCAL_TASK : MENU_LOCAL_TASK,
'weight' => $key == $default_theme ? -10 : 0,
@@ -162,7 +162,7 @@ function block_menu() {
);
}
$items['admin/structure/block/demo/' . $key] = array(
'title' => check_plain($theme->info['name']),
'title' => $theme->info['name'],
'page callback' => 'block_admin_demo',
'page arguments' => array($key),
'type' => MENU_CALLBACK,
@@ -692,6 +692,9 @@ function block_list($region) {
/**
* Loads a block object from the database.
*
* This function returns the first block matching the module and delta
* parameters, so it should not be used for theme-specific functionality.
*
* @param $module
* Name of the module that implements the block to load.
* @param $delta
@@ -848,10 +851,19 @@ function block_block_list_alter(&$blocks) {
* An array of visible blocks as expected by drupal_render().
*/
function _block_render_blocks($region_blocks) {
// Block caching is not compatible with node access modules. We also
// preserve the submission of forms in blocks, by fetching from cache only
$cacheable = TRUE;
// We preserve the submission of forms in blocks, by fetching from cache only
// if the request method is 'GET' (or 'HEAD').
$cacheable = !count(module_implements('node_grants')) && ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'HEAD');
if ($_SERVER['REQUEST_METHOD'] != 'GET' && $_SERVER['REQUEST_METHOD'] != 'HEAD') {
$cacheable = FALSE;
}
// Block caching is not usually compatible with node access modules, so by
// default it is disabled when node access modules exist. However, it can be
// allowed by using the variable 'block_cache_bypass_node_grants'.
elseif (!variable_get('block_cache_bypass_node_grants', FALSE) && count(module_implements('node_grants'))) {
$cacheable = FALSE;
}
// Proceed to loop over all blocks in order to compute their respective cache
// identifiers; this allows us to do one single cache_get_multiple() call
@@ -1054,7 +1066,7 @@ function block_menu_delete($menu) {
* Implements hook_form_FORM_ID_alter().
*/
function block_form_system_performance_settings_alter(&$form, &$form_state) {
$disabled = count(module_implements('node_grants'));
$disabled = (!variable_get('block_cache_bypass_node_grants', FALSE) && count(module_implements('node_grants')));
$form['caching']['block_cache'] = array(
'#type' => 'checkbox',
'#title' => t('Cache blocks'),
+2 -2
View File
@@ -75,7 +75,7 @@ class BlockTestCase extends DrupalWebTestCase {
$bid = db_query("SELECT bid FROM {block_custom} WHERE info = :info", array(':info' => $custom_block['info']))->fetchField();
// Check to see if the custom block was created by checking that it's in the database.
$this->assertNotNull($bid, 'Custom block found in database');
$this->assertTrue($bid, 'Custom block found in database');
// Check that block_block_view() returns the correct title and content.
$data = block_block_view($bid);
@@ -305,7 +305,7 @@ class BlockTestCase extends DrupalWebTestCase {
))->fetchField();
// Check to see if the block was created by checking that it's in the database.
$this->assertNotNull($bid, 'Block found in database');
$this->assertTrue($bid, 'Block found in database');
// Check whether the block can be moved to all available regions.
foreach ($this->regions as $region) {
+3 -3
View File
@@ -5,8 +5,8 @@ version = VERSION
core = 7.x
hidden = TRUE
; Information added by Drupal.org packaging script on 2014-05-08
version = "7.28"
; Information added by Drupal.org packaging script on 2015-08-19
version = "7.39"
project = "drupal"
datestamp = "1399522731"
datestamp = "1440020197"
@@ -13,8 +13,8 @@ regions[footer] = Footer
regions[highlighted] = Highlighted
regions[help] = Help
; Information added by Drupal.org packaging script on 2014-05-08
version = "7.28"
; Information added by Drupal.org packaging script on 2015-08-19
version = "7.39"
project = "drupal"
datestamp = "1399522731"
datestamp = "1440020197"
+3 -3
View File
@@ -5,8 +5,8 @@ version = VERSION
core = 7.x
files[] = blog.test
; Information added by Drupal.org packaging script on 2014-05-08
version = "7.28"
; Information added by Drupal.org packaging script on 2015-08-19
version = "7.39"
project = "drupal"
datestamp = "1399522731"
datestamp = "1440020197"
+3 -3
View File
@@ -7,8 +7,8 @@ files[] = book.test
configure = admin/content/book/settings
stylesheets[all][] = book.css
; Information added by Drupal.org packaging script on 2014-05-08
version = "7.28"
; Information added by Drupal.org packaging script on 2015-08-19
version = "7.39"
project = "drupal"
datestamp = "1399522731"
datestamp = "1440020197"
+3 -3
View File
@@ -5,8 +5,8 @@ version = VERSION
core = 7.x
files[] = color.test
; Information added by Drupal.org packaging script on 2014-05-08
version = "7.28"
; Information added by Drupal.org packaging script on 2015-08-19
version = "7.39"
project = "drupal"
datestamp = "1399522731"
datestamp = "1440020197"
+3 -3
View File
@@ -9,8 +9,8 @@ files[] = comment.test
configure = admin/content/comment
stylesheets[all][] = comment.css
; Information added by Drupal.org packaging script on 2014-05-08
version = "7.28"
; Information added by Drupal.org packaging script on 2015-08-19
version = "7.39"
project = "drupal"
datestamp = "1399522731"
datestamp = "1440020197"
+21 -14
View File
@@ -993,12 +993,7 @@ function comment_build_content($comment, $node, $view_mode = 'full', $langcode =
$comment->content = array();
// Allow modules to change the view mode.
$context = array(
'entity_type' => 'comment',
'entity' => $comment,
'langcode' => $langcode,
);
drupal_alter('entity_view_mode', $view_mode, $context);
$view_mode = key(entity_view_mode_prepare('comment', array($comment->cid => $comment), $view_mode, $langcode));
// Build fields content.
field_attach_prepare_view('comment', array($comment->cid => $comment), $view_mode, $langcode);
@@ -1108,17 +1103,26 @@ function comment_links($comment, $node) {
* An array in the format expected by drupal_render().
*/
function comment_view_multiple($comments, $node, $view_mode = 'full', $weight = 0, $langcode = NULL) {
field_attach_prepare_view('comment', $comments, $view_mode, $langcode);
entity_prepare_view('comment', $comments, $langcode);
$build = array();
$entities_by_view_mode = entity_view_mode_prepare('comment', $comments, $view_mode, $langcode);
foreach ($entities_by_view_mode as $entity_view_mode => $entities) {
field_attach_prepare_view('comment', $entities, $entity_view_mode, $langcode);
entity_prepare_view('comment', $entities, $langcode);
foreach ($entities as $entity) {
$build[$entity->cid] = comment_view($entity, $node, $entity_view_mode, $langcode);
}
}
$build = array(
'#sorted' => TRUE,
);
foreach ($comments as $comment) {
$build[$comment->cid] = comment_view($comment, $node, $view_mode, $langcode);
$build[$comment->cid]['#weight'] = $weight;
$weight++;
}
// Sort here, to preserve the input order of the entities that were passed to
// this function.
uasort($build, 'element_sort');
$build['#sorted'] = TRUE;
return $build;
}
@@ -2603,7 +2607,7 @@ function comment_unpublish_action($comment, $context = array()) {
/**
* Unpublishes a comment if it contains certain keywords.
*
* @param $comment
* @param object $comment
* Comment object to modify.
* @param array $context
* Array with components:
@@ -2615,10 +2619,13 @@ function comment_unpublish_action($comment, $context = array()) {
* @see comment_unpublish_by_keyword_action_submit()
*/
function comment_unpublish_by_keyword_action($comment, $context) {
$node = node_load($comment->nid);
$build = comment_view($comment, $node);
$text = drupal_render($build);
foreach ($context['keywords'] as $keyword) {
$text = drupal_render($comment);
if (strpos($text, $keyword) !== FALSE) {
$comment->status = COMMENT_NOT_PUBLISHED;
comment_save($comment);
watchdog('action', 'Unpublished comment %subject.', array('%subject' => $comment->subject));
break;
}
+36 -1
View File
@@ -13,7 +13,7 @@ class CommentHelperCase extends DrupalWebTestCase {
function setUp() {
parent::setUp('comment', 'search');
// Create users and test node.
$this->admin_user = $this->drupalCreateUser(array('administer content types', 'administer comments', 'administer blocks'));
$this->admin_user = $this->drupalCreateUser(array('administer content types', 'administer comments', 'administer blocks', 'administer actions'));
$this->web_user = $this->drupalCreateUser(array('access comments', 'post comments', 'create article content', 'edit own comments'));
$this->node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1, 'uid' => $this->web_user->uid));
}
@@ -1973,6 +1973,41 @@ class CommentActionsTestCase extends CommentHelperCase {
$this->clearWatchdog();
}
/**
* Tests the unpublish comment by keyword action.
*/
public function testCommentUnpublishByKeyword() {
$this->drupalLogin($this->admin_user);
$callback = 'comment_unpublish_by_keyword_action';
$hash = drupal_hash_base64($callback);
$comment_text = $keywords = $this->randomName();
$edit = array(
'actions_label' => $callback,
'keywords' => $keywords,
);
$this->drupalPost("admin/config/system/actions/configure/$hash", $edit, t('Save'));
$action = db_query("SELECT aid, type, callback, parameters, label FROM {actions} WHERE callback = :callback", array(':callback' => $callback))->fetchObject();
$this->assertTrue($action, 'The action could be loaded.');
$comment = $this->postComment($this->node, $comment_text, $this->randomName());
// Load the full comment so that status is available.
$comment = comment_load($comment->id);
$this->assertTrue($comment->status == COMMENT_PUBLISHED, 'The comment status was set to published.');
comment_unpublish_by_keyword_action($comment, array('keywords' => array($keywords)));
// We need to make sure that the comment has been saved with status
// unpublished.
$this->assertEqual(comment_load($comment->cid)->status, COMMENT_NOT_PUBLISHED, 'Comment was unpublished.');
$this->assertWatchdogMessage('Unpublished comment %subject.', array('%subject' => $comment->subject), 'Found watchdog message.');
$this->clearWatchdog();
}
/**
* Verify that a watchdog message has been entered.
*
+3 -3
View File
@@ -6,8 +6,8 @@ core = 7.x
files[] = contact.test
configure = admin/structure/contact
; Information added by Drupal.org packaging script on 2014-05-08
version = "7.28"
; Information added by Drupal.org packaging script on 2015-08-19
version = "7.39"
project = "drupal"
datestamp = "1399522731"
datestamp = "1440020197"
+2 -2
View File
@@ -134,7 +134,7 @@ function contact_site_form_submit($form, &$form_state) {
global $user, $language;
$values = $form_state['values'];
$values['sender'] = $user;
$values['sender'] = clone $user;
$values['sender']->name = $values['name'];
$values['sender']->mail = $values['mail'];
$values['category'] = contact_load($values['cid']);
@@ -270,7 +270,7 @@ function contact_personal_form_submit($form, &$form_state) {
global $user, $language;
$values = $form_state['values'];
$values['sender'] = $user;
$values['sender'] = clone $user;
$values['sender']->name = $values['name'];
$values['sender']->mail = $values['mail'];
+3 -3
View File
@@ -5,8 +5,8 @@ version = VERSION
core = 7.x
files[] = contextual.test
; Information added by Drupal.org packaging script on 2014-05-08
version = "7.28"
; Information added by Drupal.org packaging script on 2015-08-19
version = "7.39"
project = "drupal"
datestamp = "1399522731"
datestamp = "1440020197"
+3 -3
View File
@@ -7,8 +7,8 @@ files[] = dashboard.test
dependencies[] = block
configure = admin/dashboard/customize
; Information added by Drupal.org packaging script on 2014-05-08
version = "7.28"
; Information added by Drupal.org packaging script on 2015-08-19
version = "7.39"
project = "drupal"
datestamp = "1399522731"
datestamp = "1440020197"
+4 -4
View File
@@ -32,13 +32,13 @@ Drupal.behaviors.dashboard = {
empty_text = Drupal.settings.dashboard.emptyRegionTextInactive;
}
// We need a placeholder.
if ($('.placeholder', this).length == 0) {
$(this).append('<div class="placeholder"></div>');
if ($('.dashboard-placeholder', this).length == 0) {
$(this).append('<div class="dashboard-placeholder"></div>');
}
$('.placeholder', this).html(empty_text);
$('.dashboard-placeholder', this).html(empty_text);
}
else {
$('.placeholder', this).remove();
$('.dashboard-placeholder', this).remove();
}
});
},
+3 -3
View File
@@ -5,8 +5,8 @@ version = VERSION
core = 7.x
files[] = dblog.test
; Information added by Drupal.org packaging script on 2014-05-08
version = "7.28"
; Information added by Drupal.org packaging script on 2015-08-19
version = "7.39"
project = "drupal"
datestamp = "1399522731"
datestamp = "1440020197"
+20 -3
View File
@@ -1328,10 +1328,27 @@ function hook_field_attach_load($entity_type, $entities, $age, $options) {
* @param $entity
* The entity with fields to validate.
* @param array $errors
* An associative array of errors keyed by field_name, language, delta.
* The array of errors (keyed by field name, language code, and delta) that
* have already been reported for the entity. The function should add its
* errors to this array. Each error is an associative array with the following
* keys and values:
* - error: An error code (should be a string prefixed with the module name).
* - message: The human readable message to be displayed.
*/
function hook_field_attach_validate($entity_type, $entity, &$errors) {
// @todo Needs function body.
// Make sure any images in article nodes have an alt text.
if ($entity_type == 'node' && $entity->type == 'article' && !empty($entity->field_image)) {
foreach ($entity->field_image as $langcode => $items) {
foreach ($items as $delta => $item) {
if (!empty($item['fid']) && empty($item['alt'])) {
$errors['field_image'][$langcode][$delta][] = array(
'error' => 'field_example_invalid',
'message' => t('All images in articles need to have an alternative text set.'),
);
}
}
}
}
}
/**
@@ -1880,7 +1897,7 @@ function hook_field_storage_write($entity_type, $entity, $op, $fields) {
$items = (array) $entity->{$field_name}[$langcode];
$delta_count = 0;
foreach ($items as $delta => $item) {
// We now know we have someting to insert.
// We now know we have something to insert.
$do_insert = TRUE;
$record = array(
'entity_type' => $entity_type,
+1 -1
View File
@@ -318,7 +318,7 @@ function _field_invoke_multiple($op, $entity_type, $entities, &$a = NULL, &$b =
// Unless a language suggestion is provided we iterate on all the
// available languages.
$available_languages = field_available_languages($entity_type, $field);
$language = !empty($options['language'][$id]) ? $options['language'][$id] : $options['language'];
$language = is_array($options['language']) && !empty($options['language'][$id]) ? $options['language'][$id] : $options['language'];
$languages = _field_language_suggestion($available_languages, $language, $field_name);
foreach ($languages as $langcode) {
$grouped_items[$field_id][$langcode][$id] = isset($entity->{$field_name}[$langcode]) ? $entity->{$field_name}[$langcode] : array();
+4 -4
View File
@@ -60,11 +60,11 @@ function field_create_field($field) {
}
// Field type is required.
if (empty($field['type'])) {
throw new FieldException('Attempt to create a field with no type.');
throw new FieldException(format_string('Attempt to create field @field_name with no type.', array('@field_name' => $field['field_name'])));
}
// Field name cannot contain invalid characters.
if (!preg_match('/^[_a-z]+[_a-z0-9]*$/', $field['field_name'])) {
throw new FieldException('Attempt to create a field with invalid characters. Only lowercase alphanumeric characters and underscores are allowed, and only lowercase letters and underscore are allowed as the first character');
throw new FieldException(format_string('Attempt to create a field @field_name with invalid characters. Only lowercase alphanumeric characters and underscores are allowed, and only lowercase letters and underscore are allowed as the first character', array('@field_name' => $field['field_name'])));
}
// Field name cannot be longer than 32 characters. We use drupal_strlen()
@@ -540,9 +540,9 @@ function field_create_instance($instance) {
* // Fetch an instance info array.
* $instance_info = field_info_instance($entity_type, $field_name, $bundle_name);
* // Change a single property in the instance definition.
* $instance_info['definition']['required'] = TRUE;
* $instance_info['required'] = TRUE;
* // Write the changed definition back.
* field_update_instance($instance_info['definition']);
* field_update_instance($instance_info);
* @endcode
*
* @throws FieldException
+3 -3
View File
@@ -11,8 +11,8 @@ dependencies[] = field_sql_storage
required = TRUE
stylesheets[all][] = theme/field.css
; Information added by Drupal.org packaging script on 2014-05-08
version = "7.28"
; Information added by Drupal.org packaging script on 2015-08-19
version = "7.39"
project = "drupal"
datestamp = "1399522731"
datestamp = "1440020197"
+21 -5
View File
@@ -146,7 +146,10 @@ class FieldInfo {
// Save in "static" and persistent caches.
$this->fieldMap = $map;
cache_set('field_info:field_map', $map, 'cache_field');
if (lock_acquire('field_info:field_map')) {
cache_set('field_info:field_map', $map, 'cache_field');
lock_release('field_info:field_map');
}
return $map;
}
@@ -174,7 +177,10 @@ class FieldInfo {
}
// Store in persistent cache.
cache_set('field_info:fields', $this->fieldsById, 'cache_field');
if (lock_acquire('field_info:fields')) {
cache_set('field_info:fields', $this->fieldsById, 'cache_field');
lock_release('field_info:fields');
}
}
// Fill the name/ID map.
@@ -231,7 +237,10 @@ class FieldInfo {
}
// Store in persistent cache.
cache_set('field_info:instances', $this->bundleInstances, 'cache_field');
if (lock_acquire('field_info:instances')) {
cache_set('field_info:instances', $this->bundleInstances, 'cache_field');
lock_release('field_info:instances');
}
}
$this->loadedAllInstances = TRUE;
@@ -419,7 +428,11 @@ class FieldInfo {
foreach ($instances as $instance) {
$cache['fields'][] = $this->fieldsById[$instance['field_id']];
}
cache_set("field_info:bundle:$entity_type:$bundle", $cache, 'cache_field');
if (lock_acquire("field_info:bundle:$entity_type:$bundle")) {
cache_set("field_info:bundle:$entity_type:$bundle", $cache, 'cache_field');
lock_release("field_info:bundle:$entity_type:$bundle");
}
return $instances;
}
@@ -460,7 +473,10 @@ class FieldInfo {
// Store in the 'static' and persistent caches.
$this->bundleExtraFields[$entity_type][$bundle] = $info;
cache_set("field_info:bundle_extra:$entity_type:$bundle", $info, 'cache_field');
if (lock_acquire("field_info:bundle_extra:$entity_type:$bundle")) {
cache_set("field_info:bundle_extra:$entity_type:$bundle", $info, 'cache_field');
lock_release("field_info:bundle_extra:$entity_type:$bundle");
}
return $this->bundleExtraFields[$entity_type][$bundle];
}
+5 -1
View File
@@ -223,7 +223,11 @@ function _field_info_collate_types($reset = FALSE) {
}
drupal_alter('field_storage_info', $info['storage types']);
cache_set("field_info_types:$langcode", $info, 'cache_field');
// Set the cache if we can acquire a lock.
if (lock_acquire("field_info_types:$langcode")) {
cache_set("field_info_types:$langcode", $info, 'cache_field');
lock_release("field_info_types:$langcode");
}
}
}
+1
View File
@@ -162,6 +162,7 @@ function field_schema() {
),
);
$schema['cache_field'] = drupal_get_schema_unprocessed('system', 'cache');
$schema['cache_field']['description'] = 'Cache table for the Field module to store already built field information.';
return $schema;
}
+14 -14
View File
@@ -342,17 +342,6 @@ function field_cron() {
field_purge_batch($limit);
}
/**
* Implements hook_modules_uninstalled().
*/
function field_modules_uninstalled($modules) {
module_load_include('inc', 'field', 'field.crud');
foreach ($modules as $module) {
// TODO D7: field_module_delete is not yet implemented
// field_module_delete($module);
}
}
/**
* Implements hook_system_info_alter().
*
@@ -905,6 +894,7 @@ function field_view_field($entity_type, $entity, $field_name, $display = array()
'entity' => $entity,
'view_mode' => '_custom',
'display' => $display,
'language' => $langcode,
);
drupal_alter('field_attach_view', $result, $context);
@@ -947,20 +937,30 @@ function field_get_items($entity_type, $entity, $field_name, $langcode = NULL) {
*/
function field_has_data($field) {
$query = new EntityFieldQuery();
return (bool) $query
->fieldCondition($field)
$query = $query->fieldCondition($field)
->range(0, 1)
->count()
// Neutralize the 'entity_field_access' query tag added by
// field_sql_storage_field_storage_query(). The result cannot depend on the
// access grants of the current user.
->addTag('DANGEROUS_ACCESS_CHECK_OPT_OUT')
->addTag('DANGEROUS_ACCESS_CHECK_OPT_OUT');
return (bool) $query
->execute() || (bool) $query
->age(FIELD_LOAD_REVISION)
->execute();
}
/**
* Determine whether the user has access to a given field.
*
* This function does not determine whether access is granted to the entity
* itself, only the specific field. Callers are responsible for ensuring that
* entity access is also respected. For example, when checking field access for
* nodes, check node_access() before checking field_access(), and when checking
* field access for entities using the Entity API contributed module,
* check entity_access() before checking field_access().
*
* @param $op
* The operation to be performed. Possible values:
* - 'edit'
@@ -7,8 +7,8 @@ dependencies[] = field
files[] = field_sql_storage.test
required = TRUE
; Information added by Drupal.org packaging script on 2014-05-08
version = "7.28"
; Information added by Drupal.org packaging script on 2015-08-19
version = "7.39"
project = "drupal"
datestamp = "1399522731"
datestamp = "1440020197"
@@ -64,6 +64,49 @@ function _field_sql_storage_revision_tablename($field) {
}
}
/**
* Generates a table alias for a field data table.
*
* The table alias is unique for each unique combination of field name
* (represented by $tablename), delta_group and language_group.
*
* @param $tablename
* The name of the data table for this field.
* @param $field_key
* The numeric key of this field in this query.
* @param $query
* The EntityFieldQuery that is executed.
*
* @return
* A string containing the generated table alias.
*/
function _field_sql_storage_tablealias($tablename, $field_key, EntityFieldQuery $query) {
// No conditions present: use a unique alias.
if (empty($query->fieldConditions[$field_key])) {
return $tablename . $field_key;
}
// Find the delta and language condition values and append them to the alias.
$condition = $query->fieldConditions[$field_key];
$alias = $tablename;
$has_group_conditions = FALSE;
foreach (array('delta', 'language') as $column) {
if (isset($condition[$column . '_group'])) {
$alias .= '_' . $column . '_' . $condition[$column . '_group'];
$has_group_conditions = TRUE;
}
}
// Return the alias when it has delta/language group conditions.
if ($has_group_conditions) {
return $alias;
}
// Return a unique alias in other cases.
return $tablename . $field_key;
}
/**
* Generate a column name for a field data table.
*
@@ -180,7 +223,17 @@ function _field_sql_storage_schema($field) {
foreach ($field['indexes'] as $index_name => $columns) {
$real_name = _field_sql_storage_indexname($field['field_name'], $index_name);
foreach ($columns as $column_name) {
$current['indexes'][$real_name][] = _field_sql_storage_columnname($field['field_name'], $column_name);
// Indexes can be specified as either a column name or an array with
// column name and length. Allow for either case.
if (is_array($column_name)) {
$current['indexes'][$real_name][] = array(
_field_sql_storage_columnname($field['field_name'], $column_name[0]),
$column_name[1],
);
}
else {
$current['indexes'][$real_name][] = _field_sql_storage_columnname($field['field_name'], $column_name);
}
}
}
@@ -289,7 +342,17 @@ function field_sql_storage_field_storage_update_field($field, $prior_field, $has
$real_name = _field_sql_storage_indexname($field['field_name'], $name);
$real_columns = array();
foreach ($columns as $column_name) {
$real_columns[] = _field_sql_storage_columnname($field['field_name'], $column_name);
// Indexes can be specified as either a column name or an array with
// column name and length. Allow for either case.
if (is_array($column_name)) {
$real_columns[] = array(
_field_sql_storage_columnname($field['field_name'], $column_name[0]),
$column_name[1],
);
}
else {
$real_columns[] = _field_sql_storage_columnname($field['field_name'], $column_name);
}
}
db_add_index($table, $real_name, $real_columns);
db_add_index($revision_table, $real_name, $real_columns);
@@ -422,7 +485,7 @@ function field_sql_storage_field_storage_write($entity_type, $entity, $op, $fiel
$items = (array) $entity->{$field_name}[$langcode];
$delta_count = 0;
foreach ($items as $delta => $item) {
// We now know we have someting to insert.
// We now know we have something to insert.
$do_insert = TRUE;
$record = array(
'entity_type' => $entity_type,
@@ -504,17 +567,21 @@ function field_sql_storage_field_storage_query(EntityFieldQuery $query) {
$id_key = 'revision_id';
}
$table_aliases = array();
$query_tables = NULL;
// Add tables for the fields used.
foreach ($query->fields as $key => $field) {
$tablename = $tablename_function($field);
// Every field needs a new table.
$table_alias = $tablename . $key;
$table_alias = _field_sql_storage_tablealias($tablename, $key, $query);
$table_aliases[$key] = $table_alias;
if ($key) {
$select_query->join($tablename, $table_alias, "$table_alias.entity_type = $field_base_table.entity_type AND $table_alias.$id_key = $field_base_table.$id_key");
if (!isset($query_tables[$table_alias])) {
$select_query->join($tablename, $table_alias, "$table_alias.entity_type = $field_base_table.entity_type AND $table_alias.$id_key = $field_base_table.$id_key");
}
}
else {
$select_query = db_select($tablename, $table_alias);
// Store a reference to the list of joined tables.
$query_tables =& $select_query->getTables();
// Allow queries internal to the Field API to opt out of the access
// check, for situations where the query's results should not depend on
// the access grants for the current user.
@@ -355,14 +355,14 @@ class FieldSqlStorageTestCase extends DrupalWebTestCase {
field_attach_insert('test_entity', $entity);
// Add an index
$field = array('field_name' => $field_name, 'indexes' => array('value' => array('value')));
$field = array('field_name' => $field_name, 'indexes' => array('value' => array(array('value', 255))));
field_update_field($field);
foreach ($tables as $table) {
$this->assertTrue(Database::getConnection()->schema()->indexExists($table, "{$field_name}_value"), format_string("Index on value created in %table", array('%table' => $table)));
}
// Add a different index, removing the existing custom one.
$field = array('field_name' => $field_name, 'indexes' => array('value_format' => array('value', 'format')));
$field = array('field_name' => $field_name, 'indexes' => array('value_format' => array(array('value', 127), array('format', 127))));
field_update_field($field);
foreach ($tables as $table) {
$this->assertTrue(Database::getConnection()->schema()->indexExists($table, "{$field_name}_value_format"), format_string("Index on value_format created in %table", array('%table' => $table)));
@@ -438,4 +438,149 @@ class FieldSqlStorageTestCase extends DrupalWebTestCase {
$this->assertEqual($foreign_key['table'], $foreign_key_name, 'Foreign key table name preserved in the schema');
$this->assertEqual($foreign_key['columns'][$foreign_key_column], 'id', 'Foreign key column name preserved in the schema');
}
/**
* Test handling multiple conditions on one column of a field.
*
* Tests both the result and the complexity of the query.
*/
function testFieldSqlStorageMultipleConditionsSameColumn() {
$entity = field_test_create_stub_entity(NULL, NULL);
$entity->{$this->field_name}[LANGUAGE_NONE][0] = array('value' => 1);
field_test_entity_save($entity);
$entity = field_test_create_stub_entity(NULL, NULL);
$entity->{$this->field_name}[LANGUAGE_NONE][0] = array('value' => 2);
field_test_entity_save($entity);
$entity = field_test_create_stub_entity(NULL, NULL);
$entity->{$this->field_name}[LANGUAGE_NONE][0] = array('value' => 3);
field_test_entity_save($entity);
$query = new EntityFieldQuery();
// This tag causes field_test_query_store_global_test_query_alter() to be
// invoked so that the query can be tested.
$query->addTag('store_global_test_query');
$query->entityCondition('entity_type', 'test_entity');
$query->entityCondition('bundle', 'test_bundle');
$query->fieldCondition($this->field_name, 'value', 1, '<>', 0, LANGUAGE_NONE);
$query->fieldCondition($this->field_name, 'value', 2, '<>', 0, LANGUAGE_NONE);
$result = field_sql_storage_field_storage_query($query);
// Test the results.
$this->assertEqual(1, count($result), format_string('One result should be returned, got @count', array('@count' => count($result))));
// Test the complexity of the query.
$query = $GLOBALS['test_query'];
$this->assertNotNull($query, 'Precondition: the query should be available');
$tables = $query->getTables();
$this->assertEqual(1, count($tables), 'The query contains just one table.');
// Clean up.
unset($GLOBALS['test_query']);
}
/**
* Test handling multiple conditions on multiple columns of one field.
*
* Tests both the result and the complexity of the query.
*/
function testFieldSqlStorageMultipleConditionsDifferentColumns() {
// Create the multi-column shape field
$field_name = strtolower($this->randomName());
$field = array('field_name' => $field_name, 'type' => 'shape', 'cardinality' => 4);
$field = field_create_field($field);
$instance = array(
'field_name' => $field_name,
'entity_type' => 'test_entity',
'bundle' => 'test_bundle'
);
$instance = field_create_instance($instance);
$entity = field_test_create_stub_entity(NULL, NULL);
$entity->{$field_name}[LANGUAGE_NONE][0] = array('shape' => 'A', 'color' => 'X');
field_test_entity_save($entity);
$entity = field_test_create_stub_entity(NULL, NULL);
$entity->{$field_name}[LANGUAGE_NONE][0] = array('shape' => 'B', 'color' => 'X');
field_test_entity_save($entity);
$entity = field_test_create_stub_entity(NULL, NULL);
$entity->{$field_name}[LANGUAGE_NONE][0] = array('shape' => 'A', 'color' => 'Y');
field_test_entity_save($entity);
$query = new EntityFieldQuery();
// This tag causes field_test_query_store_global_test_query_alter() to be
// invoked so that the query can be tested.
$query->addTag('store_global_test_query');
$query->entityCondition('entity_type', 'test_entity');
$query->entityCondition('bundle', 'test_bundle');
$query->fieldCondition($field_name, 'shape', 'B', '=', 'something', LANGUAGE_NONE);
$query->fieldCondition($field_name, 'color', 'X', '=', 'something', LANGUAGE_NONE);
$result = field_sql_storage_field_storage_query($query);
// Test the results.
$this->assertEqual(1, count($result), format_string('One result should be returned, got @count', array('@count' => count($result))));
// Test the complexity of the query.
$query = $GLOBALS['test_query'];
$this->assertNotNull($query, 'Precondition: the query should be available');
$tables = $query->getTables();
$this->assertEqual(1, count($tables), 'The query contains just one table.');
// Clean up.
unset($GLOBALS['test_query']);
}
/**
* Test handling multiple conditions on multiple columns of one field for multiple languages.
*
* Tests both the result and the complexity of the query.
*/
function testFieldSqlStorageMultipleConditionsDifferentColumnsMultipleLanguages() {
field_test_entity_info_translatable('test_entity', TRUE);
// Create the multi-column shape field
$field_name = strtolower($this->randomName());
$field = array('field_name' => $field_name, 'type' => 'shape', 'cardinality' => 4, 'translatable' => TRUE);
$field = field_create_field($field);
$instance = array(
'field_name' => $field_name,
'entity_type' => 'test_entity',
'bundle' => 'test_bundle',
'settings' => array(
// Prevent warning from field_test_field_load().
'test_hook_field_load' => FALSE,
),
);
$instance = field_create_instance($instance);
$entity = field_test_create_stub_entity(NULL, NULL);
$entity->{$field_name}[LANGUAGE_NONE][0] = array('shape' => 'A', 'color' => 'X');
$entity->{$field_name}['en'][0] = array('shape' => 'B', 'color' => 'Y');
field_test_entity_save($entity);
$entity = field_test_entity_test_load($entity->ftid);
$query = new EntityFieldQuery();
// This tag causes field_test_query_store_global_test_query_alter() to be
// invoked so that the query can be tested.
$query->addTag('store_global_test_query');
$query->entityCondition('entity_type', 'test_entity');
$query->entityCondition('bundle', 'test_bundle');
$query->fieldCondition($field_name, 'color', 'X', '=', NULL, LANGUAGE_NONE);
$query->fieldCondition($field_name, 'shape', 'B', '=', NULL, 'en');
$result = field_sql_storage_field_storage_query($query);
// Test the results.
$this->assertEqual(1, count($result), format_string('One result should be returned, got @count', array('@count' => count($result))));
// Test the complexity of the query.
$query = $GLOBALS['test_query'];
$this->assertNotNull($query, 'Precondition: the query should be available');
$tables = $query->getTables();
$this->assertEqual(2, count($tables), 'The query contains two tables.');
// Clean up.
unset($GLOBALS['test_query']);
}
}
+3 -3
View File
@@ -7,8 +7,8 @@ dependencies[] = field
dependencies[] = options
files[] = tests/list.test
; Information added by Drupal.org packaging script on 2014-05-08
version = "7.28"
; Information added by Drupal.org packaging script on 2015-08-19
version = "7.39"
project = "drupal"
datestamp = "1399522731"
datestamp = "1440020197"
@@ -5,8 +5,8 @@ package = Testing
version = VERSION
hidden = TRUE
; Information added by Drupal.org packaging script on 2014-05-08
version = "7.28"
; Information added by Drupal.org packaging script on 2015-08-19
version = "7.39"
project = "drupal"
datestamp = "1399522731"
datestamp = "1440020197"
+3 -3
View File
@@ -6,8 +6,8 @@ core = 7.x
dependencies[] = field
files[] = number.test
; Information added by Drupal.org packaging script on 2014-05-08
version = "7.28"
; Information added by Drupal.org packaging script on 2015-08-19
version = "7.39"
project = "drupal"
datestamp = "1399522731"
datestamp = "1440020197"
+3 -3
View File
@@ -6,8 +6,8 @@ core = 7.x
dependencies[] = field
files[] = options.test
; Information added by Drupal.org packaging script on 2014-05-08
version = "7.28"
; Information added by Drupal.org packaging script on 2015-08-19
version = "7.39"
project = "drupal"
datestamp = "1399522731"
datestamp = "1440020197"
+3 -3
View File
@@ -7,8 +7,8 @@ dependencies[] = field
files[] = text.test
required = TRUE
; Information added by Drupal.org packaging script on 2014-05-08
version = "7.28"
; Information added by Drupal.org packaging script on 2015-08-19
version = "7.39"
project = "drupal"
datestamp = "1399522731"
datestamp = "1440020197"
+17 -13
View File
@@ -12,9 +12,9 @@ Drupal.behaviors.textSummary = {
$summaries.once('text-summary-wrapper').each(function(index) {
var $summary = $(this);
var $summaryLabel = $summary.find('label');
var $summaryLabel = $summary.find('label').first();
var $full = $widget.find('.text-full').eq(index).closest('.form-item');
var $fullLabel = $full.find('label');
var $fullLabel = $full.find('label').first();
// Create a placeholder label when the field cardinality is
// unlimited or greater than 1.
@@ -23,24 +23,28 @@ Drupal.behaviors.textSummary = {
}
// Setup the edit/hide summary link.
var $link = $('<span class="field-edit-link">(<a class="link-edit-summary" href="#">' + Drupal.t('Hide summary') + '</a>)</span>').toggle(
function () {
var $link = $('<span class="field-edit-link">(<a class="link-edit-summary" href="#">' + Drupal.t('Hide summary') + '</a>)</span>');
var $a = $link.find('a');
var toggleClick = true;
$link.bind('click', function (e) {
if (toggleClick) {
$summary.hide();
$(this).find('a').html(Drupal.t('Edit summary')).end().appendTo($fullLabel);
return false;
},
function () {
$summary.show();
$(this).find('a').html(Drupal.t('Hide summary')).end().appendTo($summaryLabel);
return false;
$a.html(Drupal.t('Edit summary'));
$link.appendTo($fullLabel);
}
).appendTo($summaryLabel);
else {
$summary.show();
$a.html(Drupal.t('Hide summary'));
$link.appendTo($summaryLabel);
}
toggleClick = !toggleClick;
return false;
}).appendTo($summaryLabel);
// If no summary is set, hide the summary field.
if ($(this).find('.text-summary').val() == '') {
$link.click();
}
return;
});
});
}
+1 -1
View File
@@ -245,7 +245,7 @@ function text_field_formatter_settings_summary($field, $instance, $view_mode) {
$summary = '';
if (strpos($display['type'], '_trimmed') !== FALSE) {
$summary = t('Trim length') . ': ' . $settings['trim_length'];
$summary = t('Trim length') . ': ' . check_plain($settings['trim_length']);
}
return $summary;
+62 -1
View File
@@ -484,6 +484,66 @@ class FieldAttachStorageTestCase extends FieldAttachTestCase {
$this->assertEqual($entity->{$this->field_name}[$langcode], $values, 'Insert: missing field results in default value saved');
}
/**
* Test field_has_data().
*/
function testFieldHasData() {
$entity_type = 'test_entity';
$langcode = LANGUAGE_NONE;
$field_name = 'field_1';
$field = array('field_name' => $field_name, 'type' => 'test_field');
$field = field_create_field($field);
$this->assertFalse(field_has_data($field), "No data should be detected.");
$instance = array(
'field_name' => $field_name,
'entity_type' => 'test_entity',
'bundle' => 'test_bundle'
);
$instance = field_create_instance($instance);
$table = _field_sql_storage_tablename($field);
$revision_table = _field_sql_storage_revision_tablename($field);
$columns = array('entity_type', 'entity_id', 'revision_id', 'delta', 'language', $field_name . '_value');
$eid = 0;
// Insert values into the field revision table.
$query = db_insert($revision_table)->fields($columns);
$query->values(array($entity_type, $eid, 0, 0, $langcode, 1));
$query->execute();
$this->assertTrue(field_has_data($field), "Revision data only should be detected.");
$field_name = 'field_2';
$field = array('field_name' => $field_name, 'type' => 'test_field');
$field = field_create_field($field);
$this->assertFalse(field_has_data($field), "No data should be detected.");
$instance = array(
'field_name' => $field_name,
'entity_type' => 'test_entity',
'bundle' => 'test_bundle'
);
$instance = field_create_instance($instance);
$table = _field_sql_storage_tablename($field);
$revision_table = _field_sql_storage_revision_tablename($field);
$columns = array('entity_type', 'entity_id', 'revision_id', 'delta', 'language', $field_name . '_value');
$eid = 1;
// Insert values into the field table.
$query = db_insert($table)->fields($columns);
$query->values(array($entity_type, $eid, 0, 0, $langcode, 1));
$query->execute();
$this->assertTrue(field_has_data($field), "Values only in field table should be detected.");
}
/**
* Test field_attach_delete().
*/
@@ -2146,11 +2206,12 @@ class FieldDisplayAPITestCase extends FieldTestCase {
'alter' => TRUE,
),
);
$output = field_view_field('test_entity', $this->entity, $this->field_name, $display);
$output = field_view_field('test_entity', $this->entity, $this->field_name, $display, LANGUAGE_NONE);
$this->drupalSetContent(drupal_render($output));
$setting = $display['settings']['test_formatter_setting_multiple'];
$this->assertNoText($this->label, 'Label was not displayed.');
$this->assertText('field_test_field_attach_view_alter', 'Alter fired, display passed.');
$this->assertText('field language is ' . LANGUAGE_NONE, 'Language is placed onto the context.');
$array = array();
foreach ($this->values as $delta => $value) {
$array[] = $delta . ':' . $value['value'];
+3 -3
View File
@@ -6,8 +6,8 @@ files[] = field_test.entity.inc
version = VERSION
hidden = TRUE
; Information added by Drupal.org packaging script on 2014-05-08
version = "7.28"
; Information added by Drupal.org packaging script on 2015-08-19
version = "7.39"
project = "drupal"
datestamp = "1399522731"
datestamp = "1440020197"
+15
View File
@@ -220,6 +220,10 @@ function field_test_field_attach_view_alter(&$output, $context) {
if (!empty($context['display']['settings']['alter'])) {
$output['test_field'][] = array('#markup' => 'field_test_field_attach_view_alter');
}
if (isset($output['test_field'])) {
$output['test_field'][] = array('#markup' => 'field language is ' . $context['language']);
}
}
/**
@@ -267,3 +271,14 @@ function field_test_query_efq_table_prefixing_test_alter(&$query) {
// exception if the EFQ does not properly prefix the base table.
$query->join('test_entity','te2','%alias.ftid = test_entity.ftid');
}
/**
* Implements hook_query_TAG_alter() for tag 'store_global_test_query'.
*/
function field_test_query_store_global_test_query_alter($query) {
// Save the query in a global variable so that it can be examined by tests.
// This can be used by any test which needs to check a query, but see
// FieldSqlStorageTestCase::testFieldSqlStorageMultipleConditionsSameColumn()
// for an example.
$GLOBALS['test_query'] = $query;
}
+4
View File
@@ -2105,6 +2105,10 @@ function field_ui_next_destination($entity_type, $bundle) {
$destinations = !empty($_REQUEST['destinations']) ? $_REQUEST['destinations'] : array();
if (!empty($destinations)) {
unset($_REQUEST['destinations']);
}
// Remove any external URLs.
$destinations = array_diff($destinations, array_filter($destinations, 'url_is_external'));
if ($destinations) {
return field_ui_get_destinations($destinations);
}
$admin_path = _field_ui_bundle_admin_path($entity_type, $bundle);
+3
View File
@@ -134,6 +134,9 @@ function hook_field_widget_settings_form($field, $instance) {
/**
* Specify the form elements for a formatter's settings.
*
* This hook is only invoked if hook_field_formatter_settings_summary()
* returns a non-empty value.
*
* @param $field
* The field structure being configured.
* @param $instance
+3 -3
View File
@@ -6,8 +6,8 @@ core = 7.x
dependencies[] = field
files[] = field_ui.test
; Information added by Drupal.org packaging script on 2014-05-08
version = "7.28"
; Information added by Drupal.org packaging script on 2015-08-19
version = "7.39"
project = "drupal"
datestamp = "1399522731"
datestamp = "1440020197"
+2 -2
View File
@@ -168,7 +168,7 @@ Drupal.fieldUIOverview = {
var dragObject = this;
var row = dragObject.rowObject.element;
var rowHandler = $(row).data('fieldUIRowHandler');
if (rowHandler !== undefined) {
if (typeof rowHandler !== 'undefined') {
var regionRow = $(row).prevAll('tr.region-message').get(0);
var region = regionRow.className.replace(/([^ ]+[ ]+)*region-([^ ]+)-message([ ]+[^ ]+)*/, '$2');
@@ -319,7 +319,7 @@ Drupal.fieldUIDisplayOverview.field.prototype = {
if (currentValue == 'hidden') {
// Restore the formatter back to the default formatter. Pseudo-fields do
// not have default formatters, we just return to 'visible' for those.
var value = (this.defaultFormatter != undefined) ? this.defaultFormatter : 'visible';
var value = (typeof this.defaultFormatter !== 'undefined') ? this.defaultFormatter : this.$formatSelect.find('option').val();
}
break;

Some files were not shown because too many files have changed in this diff Show More