Fri, 01 May 2020 11:56:24 +0200
Version 0.3.32 Inventory water and profile water edit screens updated and added ion balance fields. Moved acid specs to global.js. In prod_edit and rec_edit changed the water calculations, eliminated the double percentage calculation. The pH values in the water tab have now 2 decimal digits. The mash pH field is only shown in auto calculate mode. The calculated acid addition results are now a bit better and compare with several famous spreadsheets.
<?php require_once($_SERVER['DOCUMENT_ROOT'].'/config.php'); require_once($_SERVER['DOCUMENT_ROOT'].'/includes/formulas.php'); $link = mysqli_connect(DBASE_HOST,DBASE_USER,DBASE_PASS,DBASE_NAME); if (! $link) { die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error()); } if (! mysqli_set_charset($link, "utf8" )) { echo "error"; return 1; } //setlocale ( LC_ALL, 'nl_NL.UTF-8'); if (isset($_GET["record"])) $record = $_GET["record"]; else $record = 148; $result = mysqli_query($link, "SELECT * FROM recipes WHERE record='".$record."'"); $row = mysqli_fetch_array($result); $recipetype = array( 'Extract', 'Partial Mash', 'All Grain' ); $styletype = array( 'Lager', 'Ale', 'Mead', 'Wheat', 'Mixed', 'Cider' ); $hoptype = array( 'Bittering', 'Aroma', 'Both' ); $hopform = array( 'Pellet', 'Plug', 'Leaf', 'Leaf', 'Leaf' ); $hopuse = array( 'Mash', 'First wort', 'Boil', 'Aroma', 'Whirlpool', 'Dry hop' ); $fermentabletype = array( 'Grain', 'Sugar', 'Extract', 'Dry extract', 'Adjunct' ); $graintype = array( 'Base', 'Roast', 'Crystal', 'Kilned', 'Sour malt', 'Special', 'No malt' ); $yeasttype = array( 'Lager', 'Ale', 'Wheat', 'Wine', 'Champagne', 'Other', 'Other', 'Other', 'Other', 'Other' ); $yeastform = array( 'Liquid', 'Dry', 'Slant', 'Culture', 'Frozen', 'Bottle', 'Dry' ); $yeastuse = array( 'Primary', 'Secondary', 'Tertiary', 'Bottle' ); $misctype = array( 'Spice', 'Herb', 'Flavor', 'Fining', 'Water agent', 'Yeast nutrient', 'Other' ); $miscuse = array( 'Starter', 'Mash', 'Boil', 'Primary', 'Secondary', 'Bottling' ); $mashsteptype = array( 'Infusion', 'Temperature', 'Decoction' ); $colormethod = array( 'Morey', 'Mosher', 'Daniels', 'Halberstadt', 'Naudts' ); $ibumethod = array( 'Tinseth', 'Rager', 'Daniels', 'Garetz', 'Mosher', 'Noonan' ); /* * Create beerxml output */ $xw = xmlwriter_open_memory(); xmlwriter_set_indent($xw, 1); $res = xmlwriter_set_indent_string($xw, ' '); xmlwriter_start_document($xw, '1.0', 'UTF-8'); xmlwriter_start_element($xw, 'RECIPES'); xmlwriter_start_element($xw, 'RECIPE'); // Recipe basics xmlwriter_start_element($xw, 'VERSION'); xmlwriter_text($xw, '1'); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'NAME'); xmlwriter_text($xw, $row['name']); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'NOTES'); xmlwriter_text($xw, $row['notes']); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'TYPE'); xmlwriter_text($xw, $recipetype[$row['type']]); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'BREWER'); xmlwriter_text($xw, 'Anonymous'); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'BATCH_SIZE'); xmlwriter_text($xw, sprintf("%.2f",floatval($row['batch_size']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'BOIL_SIZE'); xmlwriter_text($xw, sprintf("%.2f",floatval($row['boil_size']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'BOIL_TIME'); xmlwriter_text($xw, sprintf("%.0f",floatval($row['boil_time']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'EFFICIENCY'); xmlwriter_text($xw, sprintf("%.1f",floatval($row['efficiency']))); xmlwriter_end_element($xw); if (floatval($row['est_og']) > 0) { xmlwriter_start_element($xw, 'EST_OG'); xmlwriter_text($xw, sprintf("%.3f",floatval($row['est_og']))); xmlwriter_end_element($xw); } if (floatval($row['est_fg']) > 0) { xmlwriter_start_element($xw, 'EST_FG'); xmlwriter_text($xw, sprintf("%.3f",floatval($row['est_fg']))); xmlwriter_end_element($xw); } if (floatval($row['est_abv']) > 0) { xmlwriter_start_element($xw, 'EST_ABV'); xmlwriter_text($xw, sprintf("%.1f",floatval($row['est_abv']))); xmlwriter_end_element($xw); } if (floatval($row['est_color']) > 0) { xmlwriter_start_element($xw, 'EST_COLOR'); xmlwriter_text($xw, sprintf("%.6f", ebc_to_srm(floatval($row['est_color'])))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'COLOR_METHOD'); xmlwriter_text($xw, $colormethod[$row['color_method']]); xmlwriter_end_element($xw); } if (floatval($row['est_ibu']) > 0) { xmlwriter_start_element($xw, 'EST_IBU'); xmlwriter_text($xw, sprintf("%.1f",floatval($row['est_ibu']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'IBU_METHOD'); xmlwriter_text($xw, $ibumethod[$row['ibu_method']]); xmlwriter_end_element($xw); } // Style xmlwriter_start_element($xw, 'STYLE'); xmlwriter_start_element($xw, 'VERSION'); xmlwriter_text($xw, '1'); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'NAME'); xmlwriter_text($xw, $row['st_name']); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'CATEGORY'); xmlwriter_text($xw, $row['st_category']); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'CATEGORY_NUMBER'); xmlwriter_text($xw, $row['st_category_number']); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'STYLE_LETTER'); xmlwriter_text($xw, $row['st_letter']); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'STYLE_GUIDE'); xmlwriter_text($xw, $row['st_guide']); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'TYPE'); xmlwriter_text($xw, $styletype[$row['st_type']]); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'OG_MIN'); xmlwriter_text($xw, sprintf("%.3f",floatval($row['st_og_min']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'OG_MAX'); xmlwriter_text($xw, sprintf("%.3f",floatval($row['st_og_max']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'FG_MIN'); xmlwriter_text($xw, sprintf("%.3f",floatval($row['st_fg_min']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'FG_MAX'); xmlwriter_text($xw, sprintf("%.3f",floatval($row['st_fg_max']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'IBU_MIN'); xmlwriter_text($xw, sprintf("%.0f",floatval($row['st_ibu_min']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'IBU_MAX'); xmlwriter_text($xw, sprintf("%.0f",floatval($row['st_ibu_max']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'COLOR_MIN'); xmlwriter_text($xw, sprintf("%.2f",ebc_to_srm(floatval($row['st_color_min'])))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'COLOR_MAX'); xmlwriter_text($xw, sprintf("%.2f",ebc_to_srm(floatval($row['st_color_max'])))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'CARB_MIN'); xmlwriter_text($xw, sprintf("%.1f",floatval($row['st_carb_min']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'CARB_MAX'); xmlwriter_text($xw, sprintf("%.1f",floatval($row['st_carb_max']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'ABV_MIN'); xmlwriter_text($xw, sprintf("%.1f",floatval($row['st_abv_min']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'ABV_MAX'); xmlwriter_text($xw, sprintf("%.1f",floatval($row['st_abv_max']))); xmlwriter_end_element($xw); xmlwriter_end_element($xw); // STYLE xmlwriter_start_element($xw, 'EQUIPMENT'); xmlwriter_start_element($xw, 'VERSION'); xmlwriter_text($xw, '1'); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'NAME'); xmlwriter_text($xw, 'Dummy brewery'); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'BATCH_SIZE'); xmlwriter_text($xw, sprintf("%.2f",floatval($row['batch_size']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'BOIL_SIZE'); xmlwriter_text($xw, sprintf("%.2f",floatval($row['boil_size']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'BOIL_TIME'); xmlwriter_text($xw, sprintf("%.0f",floatval($row['boil_time']))); xmlwriter_end_element($xw); xmlwriter_end_element($xw); // EQUIPMENT xmlwriter_start_element($xw, 'HOPS'); $arr = json_decode($row['json_hops'], true); foreach($arr as $item) { //foreach element in $arr xmlwriter_start_element($xw, 'HOP'); xmlwriter_start_element($xw, 'VERSION'); xmlwriter_text($xw, '1'); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'NAME'); xmlwriter_text($xw, $item['h_name']); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'ALPHA'); xmlwriter_text($xw, sprintf("%.1f",floatval($item['h_alpha']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'AMOUNT'); xmlwriter_text($xw, sprintf("%.4f",floatval($item['h_amount']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'USE'); xmlwriter_text($xw, $hopuse[$item['h_useat']]); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'TIME'); xmlwriter_text($xw, $item['h_time']); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'TYPE'); xmlwriter_text($xw, $hoptype[$item['h_type']]); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'FORM'); xmlwriter_text($xw, $hopform[$item['h_form']]); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'BETA'); xmlwriter_text($xw, sprintf("%.1f",floatval($item['h_beta']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'HSI'); xmlwriter_text($xw, sprintf("%.1f",floatval($item['h_hsi']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'ORIGIN'); xmlwriter_text($xw, $item['h_origin']); xmlwriter_end_element($xw); xmlwriter_end_element($xw); // HOP } xmlwriter_end_element($xw); // HOPS xmlwriter_start_element($xw, 'FERMENTABLES'); $arr = json_decode($row['json_fermentables'], true); foreach($arr as $item) { //foreach element in $arr if ($item['f_added'] <= 3) { xmlwriter_start_element($xw, 'FERMENTABLE'); xmlwriter_start_element($xw, 'VERSION'); xmlwriter_text($xw, '1'); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'NAME'); xmlwriter_text($xw, $item['f_name']); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'TYPE'); xmlwriter_text($xw, $fermentabletype[$item['f_type']]); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'AMOUNT'); xmlwriter_text($xw, sprintf("%.4f",floatval($item['f_amount']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'YIELD'); xmlwriter_text($xw, sprintf("%.1f",floatval($item['f_yield']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'COLOR'); xmlwriter_text($xw, sprintf("%.1f",ebc_to_srm(floatval($item['f_color'])))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'ADD_AFTER_BOIL'); ($item['f_added'] > 1) ? xmlwriter_text($xw, 'TRUE') : xmlwriter_text($xw, 'FALSE'); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'ORIGIN'); xmlwriter_text($xw, $item['f_origin']); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'SUPPLIER'); xmlwriter_text($xw, $item['f_supplier']); xmlwriter_end_element($xw); if (floatval($item['f_coarse_fine_diff'])) { xmlwriter_start_element($xw, 'COARSE_FINE_DIFF'); xmlwriter_text($xw, sprintf("%.4f",floatval($item['f_coarse_fine_diff']))); xmlwriter_end_element($xw); } if (floatval($item['f_moisture'])) { xmlwriter_start_element($xw, 'MOISTURE'); xmlwriter_text($xw, sprintf("%.4f",floatval($item['f_moisture']))); xmlwriter_end_element($xw); } if (floatval($item['f_diastatic_power'])) { xmlwriter_start_element($xw, 'DIASTATIC_POWER'); xmlwriter_text($xw, sprintf("%.4f",floatval($item['f_diastatic_power']))); xmlwriter_end_element($xw); } if (floatval($item['f_protein'])) { xmlwriter_start_element($xw, 'PROTEIN'); xmlwriter_text($xw, sprintf("%.4f",floatval($item['f_protein']))); xmlwriter_end_element($xw); } if (floatval($item['f_max_in_batch'])) { xmlwriter_start_element($xw, 'MAX_IN_BATCH'); xmlwriter_text($xw, sprintf("%.1f",floatval($item['f_max_in_batch']))); xmlwriter_end_element($xw); } xmlwriter_start_element($xw, 'RECOMMEND_MASH'); ($item['f_recommend_mash']) ? xmlwriter_text($xw, 'TRUE') : xmlwriter_text($xw, 'FALSE'); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'GRAINTYPE'); xmlwriter_text($xw, $graintype[$item['f_graintype']]); xmlwriter_end_element($xw); xmlwriter_end_element($xw); // FERMENTABLE } } xmlwriter_end_element($xw); // FERMENTABLES xmlwriter_start_element($xw, 'MISCS'); $arr = json_decode($row['json_miscs'], true); foreach($arr as $item) { xmlwriter_start_element($xw, 'MISC'); xmlwriter_start_element($xw, 'VERSION'); xmlwriter_text($xw, '1'); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'NAME'); xmlwriter_text($xw, $item['m_name']); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'TYPE'); xmlwriter_text($xw, $misctype[$item['m_type']]); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'AMOUNT'); xmlwriter_text($xw, sprintf("%.5f",floatval($item['m_amount']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'AMOUNT_IS_WEIGHT'); ($item['m_amount_is_weight']) ? xmlwriter_text($xw, 'TRUE') : xmlwriter_text($xw, 'FALSE'); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'USE'); xmlwriter_text($xw, $miscuse[$item['m_use_use']]); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'TIME'); xmlwriter_text($xw, sprintf("%.0f",floatval($item['m_time']))); xmlwriter_end_element($xw); xmlwriter_end_element($xw); // MISC } xmlwriter_end_element($xw); // MISCS xmlwriter_start_element($xw, 'YEASTS'); $arr = json_decode($row['json_yeasts'], true); foreach($arr as $item) { //foreach element in $arr xmlwriter_start_element($xw, 'YEAST'); xmlwriter_start_element($xw, 'VERSION'); xmlwriter_text($xw, '1'); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'NAME'); xmlwriter_text($xw, $item['y_name']); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'TYPE'); xmlwriter_text($xw, $yeasttype[$item['y_type']]); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'FORM'); xmlwriter_text($xw, $yeastform[$item['y_form']]); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'AMOUNT'); xmlwriter_text($xw, sprintf("%.5f",floatval($item['y_amount']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'AMOUNT_IS_WEIGHT'); ($item['y_form'] == 1) ? xmlwriter_text($xw, 'TRUE') : xmlwriter_text($xw, 'FALSE'); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'LABORATORY'); xmlwriter_text($xw, $item['y_laboratory']); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'PRODUCT_ID'); xmlwriter_text($xw, $item['y_product_id']); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'MIN_TEMPERATURE'); xmlwriter_text($xw, sprintf("%.1f",floatval($item['y_min_temperature']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'MAX_TEMPERATURE'); xmlwriter_text($xw, sprintf("%.1f",floatval($item['y_max_temperature']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'ATTENUATION'); xmlwriter_text($xw, sprintf("%.1f",floatval($item['y_attenuation']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'ADD_TO_SECONDARY'); ($item['y_use'] == 0) ? xmlwriter_text($xw, 'FALSE') : xmlwriter_text($xw, 'TRUE'); xmlwriter_end_element($xw); xmlwriter_end_element($xw); // YEAST } xmlwriter_end_element($xw); // YEASTS xmlwriter_start_element($xw, 'WATERS'); xmlwriter_start_element($xw, 'WATER'); // Source 1 xmlwriter_start_element($xw, 'VERSION'); xmlwriter_text($xw, '1'); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'NAME'); xmlwriter_text($xw, $row['w1_name']); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'AMOUNT'); xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_amount']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'CALCIUM'); xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_calcium']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'MAGNESIUM'); xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_magnesium']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'BICARBONATE'); xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_total_alkalinity']) * 1.22)); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'SULFATE'); xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_sulfate']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'CHLORIDE'); xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_chloride']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'SODIUM'); xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_sodium']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'PH'); xmlwriter_text($xw, sprintf("%.1f",floatval($row['w1_ph']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'TOTAL_ALKALINITY'); xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_total_alkalinity']))); xmlwriter_end_element($xw); xmlwriter_end_element($xw); // WATER if (strlen($row['w2_name'])) { xmlwriter_start_element($xw, 'WATER'); // Source 2 xmlwriter_start_element($xw, 'VERSION'); xmlwriter_text($xw, '1'); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'NAME'); xmlwriter_text($xw, $row['w2_name']); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'AMOUNT'); xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_amount']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'CALCIUM'); xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_calcium']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'MAGNESIUM'); xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_magnesium']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'BICARBONATE'); xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_total_alkalinity']) * 1.22)); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'SULFATE'); xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_sulfate']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'CHLORIDE'); xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_chloride']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'SODIUM'); xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_sodium']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'PH'); xmlwriter_text($xw, sprintf("%.1f",floatval($row['w2_ph']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'TOTAL_ALKALINITY'); xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_total_alkalinity']))); xmlwriter_end_element($xw); xmlwriter_end_element($xw); // WATER } xmlwriter_end_element($xw); // WATERS xmlwriter_start_element($xw, 'MASH'); xmlwriter_start_element($xw, 'VERSION'); xmlwriter_text($xw, '1'); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'NAME'); xmlwriter_text($xw, $row['mash_name']); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'GRAIN_TEMP'); xmlwriter_text($xw, '10.0'); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'PH'); xmlwriter_text($xw, sprintf("%.1f",floatval($row['sparge_ph']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'SPARGE_TEMP'); xmlwriter_text($xw, sprintf("%.1f",floatval($row['sparge_temp']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'MASH_STEPS'); $arr = json_decode($row['json_mashs'], true); foreach($arr as $item) { //foreach element in $arr xmlwriter_start_element($xw, 'MASH_STEP'); xmlwriter_start_element($xw, 'VERSION'); xmlwriter_text($xw, '1'); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'NAME'); xmlwriter_text($xw, $item['step_name']); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'TYPE'); xmlwriter_text($xw, $mashsteptype[$item['step_type']]); xmlwriter_end_element($xw); if ($item['step_type'] == 0) { xmlwriter_start_element($xw, 'INFUSE_AMOUNT'); xmlwriter_text($xw, sprintf("%.1f",floatval($item['step_infuse_amount']))); xmlwriter_end_element($xw); } xmlwriter_start_element($xw, 'STEP_TEMP'); xmlwriter_text($xw, sprintf("%.1f",floatval($item['step_temp']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'STEP_TIME'); xmlwriter_text($xw, sprintf("%.1f",floatval($item['step_time']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'RAMP_TIME'); xmlwriter_text($xw, sprintf("%.1f",floatval($item['ramp_time']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'END_TEMP'); xmlwriter_text($xw, sprintf("%.1f",floatval($item['end_temp']))); xmlwriter_end_element($xw); xmlwriter_start_element($xw, 'PH'); xmlwriter_text($xw, sprintf("%.1f",floatval($row['mash_ph']))); xmlwriter_end_element($xw); xmlwriter_end_element($xw); // MASH_STEP } xmlwriter_end_element($xw); // MASH_STEPS xmlwriter_end_element($xw); // MASH xmlwriter_end_element($xw); // RECIPE xmlwriter_end_element($xw); // RECIPES xmlwriter_end_document($xw); $beerxml = xmlwriter_output_memory($xw); Header('Content-type: text/xml'); header('Content-Disposition: attachment; filename="' . $row['name'] . '.xml"'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Pragma: no-cache'); header('Content-Length: '.strlen($beerxml)); exit($beerxml);