PageRenderTime 25ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/wp-content/plugins/reserv/index.php

https://bitbucket.org/matthieuboutron/dinner-thrill
PHP | 512 lines | 460 code | 42 blank | 10 comment | 9 complexity | 606fcf44770dd4892cd4e34eb4797307 MD5 | raw file
Possible License(s): Apache-2.0
  1. <?php
  2. /*
  3. Plugin Name: Reserv
  4. */
  5. add_action('init',
  6. 'reserv');
  7. add_action('admin_menu',
  8. 'reserv_menu');
  9. add_action('wp_ajax_ajax-submit-step1',
  10. 'ajax_submit_step1');
  11. add_action('wp_ajax_ajax-submit-step2-back',
  12. 'ajax_submit_step2_back');
  13. add_action('wp_ajax_ajax-submit-step3-back',
  14. 'ajax_submit_step3_back');
  15. add_action('wp_ajax_ajax-submit-step2',
  16. 'ajax_submit_step2');
  17. add_action('wp_ajax_nopriv_ajax-submit-step1',
  18. 'ajax_notlogged');
  19. require_once(DIRNAME(__FILE__) . "/paypal.php");
  20. // retreive an existing reserv from a hash;
  21. function get_reserv($hash)
  22. {
  23. global $wpdb;
  24. $reserv = $wpdb->get_results(
  25. $wpdb->prepare("
  26. SELECT *
  27. FROM wp_reserv
  28. WHERE md5(CONCAT(id,'__dtdtdt'))=%s",
  29. $hash));
  30. return $reserv[0];
  31. }
  32. // Code that executes when you submit step1 (time, date, place, how many people)
  33. function ajax_submit_step1()
  34. {
  35. global $current_user, $wpdb;
  36. $current_user = wp_get_current_user();
  37. $postID_val = $_POST['post_ID'];
  38. $post = get_post($_POST['post_ID']);
  39. $people_val = substr(trim($_POST['select_people']),
  40. 0,
  41. 1);
  42. $date_val = $_POST['select_date'];
  43. $time_val = str_replace(':',
  44. '',
  45. $_POST['select_meals']);
  46. $reserv_hash = $_POST['reserv_hash'];
  47. $time_ok = false;
  48. $date_ok = false;
  49. $people_ok = false;
  50. $times = get_the_terms(9,
  51. 'booking_time');
  52. foreach($times as $t)
  53. if(strval($time_val) == $t->slug)
  54. $time_ok = true;
  55. // double validate on server-side
  56. $people_ok = $people_val >= 1 && $people_val <= 8;
  57. $date_ok = strlen($date_val) > 4; // temporaire...
  58. $form_ok = ($date_ok && $people_ok && $time_ok);
  59. if($form_ok)
  60. {
  61. if($reserv_hash)
  62. {
  63. $sql = $wpdb->prepare("UPDATE `wp_reserv` (
  64. SET
  65. `state`='Step1 ,
  66. `resto_id`=%d ,
  67. `user_id`=%d ,
  68. `personnes`=%d ,
  69. `date`=%s,
  70. `time`=%s WHERE md5(CONCAT(id,'__dtdtdt'))=%s LIMIT 1)",
  71. $postID_val,
  72. $current_user->ID,
  73. $people_val,
  74. $date_val,
  75. $time_val . "00",
  76. $reserv_hash);
  77. $ret = $wpdb->query($sql);
  78. }
  79. else
  80. {
  81. $sql = $wpdb->prepare("INSERT INTO `wp_reserv` (
  82. `state` ,
  83. `resto_id` ,
  84. `user_id` ,
  85. `personnes` ,
  86. `date` ,
  87. `time`
  88. ) VALUES (
  89. 'Step1', '%d', '%d', '%d', '%s', '%s')",
  90. $postID_val,
  91. $current_user->ID,
  92. $people_val,
  93. $date_val,
  94. $time_val . "00");
  95. $ret = $wpdb->query($sql);
  96. $reserv_id = $wpdb->insert_id;
  97. $reserv_hash = md5($wpdb->insert_id . "__dtdtdt");
  98. }
  99. $reserv = get_reserv($reserv_hash);
  100. if($_POST['redirect'])
  101. {
  102. $response = get_bloginfo('wpurl') . "/restaurant/" . $post->post_name . "?rhash=" . $reserv_hash;
  103. }
  104. else
  105. {
  106. ob_start();
  107. require_once(get_theme_root() . "/" . get_current_theme() . "/_step2.php");
  108. $response = ob_get_clean();
  109. }
  110. }
  111. else
  112. $response = "Invalid post data:" . $people_val . "," . $time_val . "," . $date_val;
  113. header("Content-Type: text/html");
  114. echo $response;
  115. exit;
  116. }
  117. function ajax_submit_step2_back()
  118. {
  119. global $current_user, $wpdb;
  120. $reserv_hash = $_POST['reserv_hash'];
  121. $post = get_post($_POST['post_ID']);
  122. $reserv = get_reserv($reserv_hash);
  123. ob_start();
  124. require_once(get_theme_root() . "/" . get_current_theme() . "/_step1.php");
  125. $response = ob_get_clean();
  126. header("Content-Type: text/html");
  127. echo $response;
  128. exit;
  129. }
  130. function ajax_submit_step3_back()
  131. {
  132. global $current_user, $wpdb;
  133. $reserv_hash = $_POST['reserv_hash'];
  134. $post = get_post($_POST['post_ID']);
  135. $reserv = get_reserv($reserv_hash);
  136. ob_start();
  137. require_once(get_theme_root() . "/" . get_current_theme() . "/_step2.php");
  138. $response = ob_get_clean();
  139. header("Content-Type: text/html");
  140. echo $response;
  141. exit;
  142. }
  143. function ajax_submit_step2()
  144. {
  145. global $current_user, $wpdb;
  146. $current_user = wp_get_current_user();
  147. $reserv_hash = $_POST['reserv_hash'];
  148. $reserv = get_reserv($reserv_hash);
  149. $post = get_post($reserv->resto_id);
  150. $lastname_val = $_POST['last_name'];
  151. $firstname_val = $_POST['first_name'];
  152. $phonenumber_val = $_POST['phone_number'];
  153. $creditcardnumber_val = $_POST['creditcard_number'];
  154. $monthcard_val = $_POST['month_card'];
  155. $yearcard_val = $_POST['year_card'];
  156. $ccv_val = $_POST['ccv'];
  157. $address_val = $_POST['address'];
  158. $city_val = $_POST['city'];
  159. $prov_val = $_POST['prov'];
  160. $postalcode_val = $_POST['postal_code'];
  161. $specialrequest_val = $_POST['special_request'];
  162. $form_ok = true;
  163. if($form_ok)
  164. {
  165. $sql = $wpdb->prepare("UPDATE `wp_reserv` SET
  166. `state` ='Step2',
  167. firstname = '%s',
  168. lastname = '%s',
  169. phone = '%s',
  170. ccnum = '%s',
  171. MM = '%s',
  172. YY = '%s',
  173. billing_pc = '%s',
  174. address = '%s',
  175. city = '%s',
  176. prov = '%s',
  177. special = '%s' WHERE md5(CONCAT(id,'__dtdtdt'))=%s LIMIT 1",
  178. $firstname_val,
  179. $lastname_val,
  180. $phonenumber_val,
  181. $creditcardnumber_val,
  182. $monthcard_val,
  183. $yearcard_val,
  184. //$ccv_val,
  185. $postalcode_val,
  186. $address_val,
  187. $city_val,
  188. $prov_val,
  189. $specialrequest_val,
  190. $reserv_hash);
  191. $ret = $wpdb->query($sql);
  192. // get the new reserv object
  193. $reserv = get_reserv($reserv_hash);
  194. $ret = make_payment($reserv,
  195. $ccv_val);
  196. if($ret['ACK'] == "SUCCESS")
  197. {
  198. $sql = $wpdb->prepare("UPDATE `wp_reserv` SET
  199. `state` ='Payed',
  200. WHERE md5(CONCAT(id,'__dtdtdt'))=%s LIMIT 1",$reserv_hash);
  201. wp_mail($current_user->user_email,
  202. 'Your dinner thrill reservation',
  203. 'Thank you for your reservation at ' . $post->name . " <ul>" .
  204. "<li>" . $reserv->personnes . " Ppl. </li>" .
  205. "<li>" . substr($reserv->time,
  206. 0,
  207. -3) . "</li>" .
  208. "<li>" . date('F j',
  209. strtotime($reserv->date)) . "</li>" .
  210. "</ul>");
  211. ob_start();
  212. require_once(get_theme_root() . "/" . get_current_theme() . "/_step3.php");
  213. $response = ob_get_clean();
  214. // Finally mark reservation as payed
  215. $ret = $wpdb->query($sql);
  216. }
  217. else
  218. {
  219. ob_start();
  220. require_once(get_theme_root() . "/" . get_current_theme() . "/_step_error.php");
  221. $response = ob_get_clean();
  222. }
  223. }
  224. else
  225. $response = "Invalid post data:" . print_r($_POST,
  226. true);
  227. header("Content-Type: text/html");
  228. echo $response;
  229. exit;
  230. }
  231. function ajax_notlogged()
  232. {
  233. $response = json_encode(array('success' => false, 'message' => 'You are not logged in'));
  234. header("Content-Type: application/json");
  235. echo $response;
  236. exit;
  237. }
  238. register_activation_hook(__FILE__,
  239. 'reserv_install');
  240. define("PLUGIN_DIR",
  241. basename(dirname(__FILE__)));
  242. define("PLUGIN_URL",
  243. get_settings("siteurl") . "/wp-content/plugins/" . PLUGIN_DIR);
  244. function reserv_menu()
  245. {
  246. global $submenu, $menu, $wpdb;
  247. add_menu_page(__("Reservations",
  248. "wp-reservation"),
  249. __("Reservations",
  250. "wp-reservation"),
  251. 0,
  252. "reservlist",
  253. 'reserv_list'
  254. ,
  255. PLUGIN_URL . "/img/go.png");
  256. }
  257. if(!class_exists('WP_List_Table'))
  258. {
  259. require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
  260. }
  261. class Reserv_List_Table extends WP_List_Table
  262. {
  263. function __construct()
  264. {
  265. global $status, $page;
  266. //Set parent defaults
  267. parent::__construct(array(
  268. 'singular' => 'reservation', //singular name of the listed records
  269. 'plural' => 'reservations', //plural name of the listed records
  270. 'ajax' => false //does this table support ajax?
  271. ));
  272. }
  273. function column_default($item, $column_name)
  274. {
  275. switch($column_name)
  276. {
  277. case 'state_':
  278. case 'when_':
  279. case 'where_':
  280. case 'who_':
  281. return $item[$column_name];
  282. default:
  283. return print_r($item,
  284. true); //Show the whole array for troubleshooting purposes
  285. }
  286. }
  287. /* function column_title($item){
  288. //Build row actions
  289. $actions = array(
  290. 'edit' => sprintf('<a href="?page=%s&action=%s&movie=%s">Edit</a>',$_REQUEST['page'],'edit',$item['ID']),
  291. 'delete' => sprintf('<a href="?page=%s&action=%s&movie=%s">Delete</a>',$_REQUEST['page'],'delete',$item['ID']),
  292. );
  293. //Return the title contents
  294. return sprintf('%1$s <span style="color:silver">(id:%2$s)</span>%3$s',
  295. /*$1%s */ /* $item['rest_name'],
  296. /*$2%s */ /* $item['ID'],
  297. /*$3%s */ /* $this->row_actions($actions)
  298. );
  299. }
  300. */
  301. function column_cb($item)
  302. {
  303. return sprintf(
  304. '<input type="checkbox" name="%1$s[]" value="%2$s" />',
  305. /* $1%s */
  306. $this->_args['singular'], //Let's simply repurpose the table's singular label ("movie")
  307. /* $2%s */
  308. $item['ID'] //The value of the checkbox should be the record's id
  309. );
  310. }
  311. function get_columns()
  312. {
  313. $columns = array(
  314. 'cb' => '<input type="checkbox" />', //Render a checkbox instead of text
  315. 'state_' => 'State',
  316. 'when_' => 'When',
  317. 'where_' => 'Where',
  318. 'who_' => 'Who'
  319. );
  320. return $columns;
  321. }
  322. function get_sortable_columns()
  323. {
  324. $sortable_columns = array(
  325. //'title' => array('title',true), //true means its already sorted
  326. //'rating' => array('rating',false),
  327. //'director' => array('director',false)
  328. );
  329. return $sortable_columns;
  330. }
  331. function get_bulk_actions()
  332. {
  333. $actions = array(
  334. 'delete' => 'Delete'
  335. );
  336. return $actions;
  337. }
  338. function process_bulk_action()
  339. {
  340. //Detect when a bulk action is being triggered…
  341. if('delete' === $this->current_action())
  342. {
  343. wp_die('Items deleted (or they would be if we had items to delete)!');
  344. }
  345. }
  346. function prepare_items()
  347. {
  348. global $wpdb;
  349. $per_page = 50;
  350. $columns = $this->get_columns();
  351. $hidden = array();
  352. $sortable = $this->get_sortable_columns();
  353. $this->_column_headers = array($columns, $hidden, $sortable);
  354. $this->process_bulk_action();
  355. $qry = "SELECT
  356. r.ID,
  357. r.state as state_,
  358. p.post_name as where_,
  359. CONCAT(r.date,' ',r.time) as when_,
  360. CONCAT(r.firstname,' ',r.lastname,IF(r.phone,CONCAT(' (',r.phone,')'),'')) as who_
  361. FROM wp_reserv r
  362. LEFT JOIN wp_posts p ON (r.resto_id = p.ID)
  363. LEFT JOIN wp_users u ON (r.user_id = u.ID)
  364. WHERE 1";
  365. $data = $wpdb->get_results($wpdb->prepare($qry),
  366. ARRAY_A);
  367. $current_page = $this->get_pagenum();
  368. $total_items = count($data);
  369. $data = array_slice($data,
  370. (($current_page - 1) * $per_page),
  371. $per_page);
  372. $this->items = $data;
  373. $this->set_pagination_args(array(
  374. 'total_items' => $total_items, //WE have to calculate the total number of items
  375. 'per_page' => $per_page, //WE have to determine how many items to show on a page
  376. 'total_pages' => ceil($total_items / $per_page) //WE have to calculate the total number of pages
  377. ));
  378. }
  379. }
  380. function reserv_list()
  381. {
  382. $listTable = new Reserv_List_Table();
  383. $listTable->prepare_items();
  384. ?>
  385. <div class="wrap">
  386. <div id="icon-users" class="icon32"><br/></div>
  387. <h2>Reservations</h2>
  388. <form id="reserv-filter" method="get">
  389. <input type="hidden" name="page" value="<?php echo $_REQUEST['page'] ?>" />
  390. <?php $listTable->display() ?>
  391. </form>
  392. </div>
  393. <?php
  394. }
  395. function reserv_install()
  396. {
  397. global $wpdb;
  398. $sql = "
  399. CREATE TABLE `wp_reserv` (
  400. `id` int(11) NOT NULL AUTO_INCREMENT,
  401. `state` varchar(50) NOT NULL,
  402. `resto_id` int(11) NOT NULL,
  403. `user_id` int(11) NOT NULL,
  404. `personnes` varchar(10) NOT NULL,
  405. `date` date NOT NULL,
  406. `time` time NOT NULL,
  407. `due` float NOT NULL,
  408. `firstname` varchar(50) NOT NULL,
  409. `lastname` varchar(50) NOT NULL,
  410. `phone` varchar(50) NOT NULL,
  411. `MM` varchar(2) NOT NULL,
  412. `YY` varchar(2) NOT NULL,
  413. `ccnum` varchar(20) NOT NULL,
  414. `billing_pc` varchar(10) NOT NULL,
  415. `address` varchar(100) NOT NULL,
  416. `city` varchar(100) NOT NULL,
  417. `prov` varchar(2) NOT NULL,
  418. `special` text NOT NULL,
  419. `savecard` tinyint(4) NOT NULL,
  420. PRIMARY KEY (`id`),
  421. UNIQUE KEY `id` (`id`)
  422. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  423. ";
  424. $wpdb->query($sql);
  425. }
  426. function reserv()
  427. {
  428. }
  429. ?>