2013-06-22 7 views
10

को sortable सूची बचत मैं एक PHP सरणी jQuery यूआई (sortable) के साथ एक मेज के आदेश को बचाने के लिए कोशिश कर रहा हूँ।jQuery यूआई पीएचपी सरणी

मैं बहुत काफी यह सरल बनाया है, लेकिन यह यह के मूल विचार है। मेरे पास एक सारणी है जिसमें एम्बेडेड एक क्रमबद्ध सूची है। तालिका एक PHP foreach बहु-आयामी सरणी है कि एक और फ़ाइल (config.php) में शामिल है को शामिल के माध्यम से उत्पन्न होता है।

config.php:

<?php 
$config  = array(
    "mno" => array('item 5'), 
    "abc" => array('item 1'), 
    "ghi" => array('item 3'), 
    "pqr" => array('item 6'), 
    "jkl" => array('item 4'), 
    "vwx" => array('item 8'), 
    "def" => array('item 2'), 
    "stu" => array('item 7'), 
); 
?> 

तालिका (index.html):

<table cellpadding="2" cellspacing="0" align="center" id="mytable"> 
    <tbody> 
<?php 
    $i = 0; 
    include 'config.php'; 
    foreach($config AS $name => $value){ 
     $item = $value[0]; 
     echo ' 
     <tr id="'.$name.'-'.$i++.'"> 
      <td>'.$item.'</td> 
     </tr>'; 
    } 
?> 
</tbody> 
</table> 

स्क्रिप्ट (index.html):

<!-- Add jQuery library --> 
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script> 
<!-- Add jQuery UI library --> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script> 
<script type="text/javascript"> 
    $(document).ready(function() { 
     var fixHelper = function(e, ui) { 
      ui.children().each(function() { 
       $(this).width($(this).width()); 
      }); 
      return ui; 
     }; 

     $("#mytable tbody").sortable({ 
      helper: fixHelper, 
      opacity: 0.5, 
      scroll: false, 
      update: function() { 
       var data = $('#mytable tbody').sortable('serialize'); 
       $.post("edit.php", {'neworder': data}); 
      } 
     }).disableSelection(); 
    }); 
</script> 

छंटाई ठीक काम करता है, लेकिन मैं कैसे सरणी क्या config.php में है में neworder मूल्य ($_POST['neworder']) को बचाने के लिए पता नहीं है।

मुझे लगता है मैं config.php में नई व्यवस्था को बचाने के लिए file_put_contents के संयोजन के साथ PHP कार्यों uasort() (या uksort(), uksort()) का उपयोग करना चाहिए।

तो कुछ इस तरह:।

<?php 
if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['neworder'])) { 
    /* 
    Here file_put_contents in config.php the new order. So: 
    $config  = array(
     "mno" => array('item 5'), 
     "abc" => array('item 1'), 
     "ghi" => array('item 3'), 
     "pqr" => array('item 6'), 
     "jkl" => array('item 4'), 
     "vwx" => array('item 8'), 
     "def" => array('item 2'), 
     "stu" => array('item 7'), 
    ); 

    Becomes: 
    $config  = array(
     "abc" => array('item 1'), 
     "def" => array('item 2'), 
     "ghi" => array('item 3'), 
     "jkl" => array('item 4'), 
     "mno" => array('item 5'), 
     "pqr" => array('item 6'), 
     "stu" => array('item 7'), 
     "vwx" => array('item 8'), 
    ); 

    After this is send by Jquery UI: 
    neworder:abc[]=1&def[]=6&ghi[]=2&jkl[]=4&mno[]=0&pqr[]=3&stu[]=7&vwx[]=5 

    I've tried this: 
     $filename = 'config.php'; 

     $lines = file($filename , FILE_IGNORE_NEW_LINES); 
     $linenumber = 2; 
     foreach($_POST['neworder'] AS $name => $val){ 
      $phost = $val[0]; 

      $lines[$linenumber] = ' "'.$name.'" => array(\'' . $phost . '\'),'; 
      $linenumber++; 
     } 

     file_put_contents($filename , implode("\n", $lines)); 

    But the '$val' is not send with Jquery only the order. 

    */ 
} 
?> 
+1

PHP फ़ाइलों में डेटा सहेजना एक बुरा विचार है। आप उन्हें कुछ जेसन या एक्सएमएल प्रारूप में स्टोर कर सकते हैं। यदि आपको इसे बड़े पैमाने पर/अधिक बार करने की आवश्यकता है, तो आपको डेटाबेस का उपयोग करना होगा। – user568109

+0

@GerritHoekstra हाय मैं आपकी मदद करना चाहता हूं और इसे इतना कठिन नहीं सोचना चाहता हूं लेकिन मैं जानना चाहता हूं कि आप इसे इस बुरे तरीके से क्यों कर रहे हैं? क्या मैं इसका कुछ हिस्सा बदल सकता हूं क्योंकि यह बेहतर हो गया है? मेरा मतलब है कि सामान्य रूप से दो या दो से अधिक स्तंभ वाले टेबल हैं जिन्हें जुई के साथ सॉर्ट किया जा सकता है और इसके प्रकार के रूप में या एक बटन पर उपयोगकर्ता क्लिक के रूप में नया ऑर्डर बचा सकता है? आप सहेजने के लिए JSON या XML प्रारूप का उपयोग क्यों नहीं करते? और चुड़ैल में JSON_Config_reader.php नाम की एक फ़ाइल उस JSON फ़ाइल को पढ़ती है और वह सरणी बनाती है? – ncm

+0

@GerritHoekstra - आप जानते हैं कि क्या। आप बस 'अच्छा प्रयास' कहने के लिए एक टिप्पणी दे सकते हैं। – ncm

उत्तर

1

आप (php में उपलब्ध 5.3+) आदेश है कि आप उन्हें में की जरूरत है कुंजी पाने के लिए एक बंद के साथ usort का उपयोग करना चाहते करने जा रहे हैं

$newOrder = $_POST["neworder"]; 
$config_keys = array_keys($config); 
usort($config_keys, function($a, $b) use($newOrder) { 
     return array_search($a, $newOrder) - array_search($b, $newOrder); 
}); 

तो फिर तुम नए आदेश

$newConfig = array(); 

foreach($config_keys as $key){ 
    $newConfig[$key] = $config[$key]; 
} 
$config = $newConfig; 
unset($newConfig); 

में पुनर्लेखन $ config बदल सकते हैं यहां से आप अपने उपयोग के मामले में जो भी तरीका सबसे अधिक समझ में आता है, उसमें आप $ config कॉन्फ़िगर कर सकते हैं। मैं इसे का उपयोग हालांकि एक php फ़ाइल बनाने के लिए के खिलाफ सलाह देंगे, एक बेहतर दृष्टिकोण

file_put_contents($cacheFile, serialize($config)); 

तो उपयोग करने के लिए पुनः प्राप्त करने के

$config = unserialize(file_get_contents($cacheFile)); 
+1

धन्यवाद, मैं इसका उपयोग करूंगा। यह jQuery UI में इस संशोधन के साथ काम करता है: 'अद्यतन: function() { \t \t \t \t \t \t वर एक = $ ('# mytable tbody') sortable ('toArray');। \t \t \t \t \t \t वर newOrdering = []; \t \t \t \t \t के लिए \t (वर मैं = 0; मैं a.length <; i ++) \t \t \t \t \t \t newOrdering [i] = एक [i] .substring (0, एक [i] .indexOf ('-')); \t \t \t \t \t \t $ .post ("edit.php", { 'neworder': newOrdering}); \t \t \t \t \t} ' – user1480019

1

इतने सारे धागे हैं कि आपकी समस्या को शामिल किया गया हो सकता है

  1. jQuery UI Sortable, then write order into a database
  2. save jquery ui-sortable positions to DB
  3. Optimal way to save order of jQueryUI sortable list with Meteor
  4. http://dev.nirmalya.net/articles/javascript/saving-ordering-of-a-sortable-list-using-jquery-ui

मुझे यकीन है कि आपको वहां अपना उत्तर मिल जाएगा हूँ।सभी

डेटाबेस

के माध्यम से

$('#mylist').sortable('toArray'); 

यह बचाने के क्रम में हो रही है और फिर डेटाबेस से आदेश मिलता है और लूप के साथ ठीक से यह दिखाने के बारे में है। ट्यूटोरियल पर एक नज़र डालें।

0

$(function() { $("ul.sortable").sortable({ connectWith: '.sortable', update: function(event, ui) { /* var position = $('.sortable').sortable('serialize', { key: 'menu', connected: true });*/ $('div').empty().html($('.sortable').serial()); } }); });

+0

उसके बाद जोड़ने कि कोड – waheed

+0

(समारोह ($) { $ .fn.serial = function() { वर सरणी = []; वर $ ELEM = $ (this); $ elem.each (समारोह (i) { वर मेनू = this.id; $ ('ली', यह) .प्रत्येक (समारोह (ई) { array.push (मेनू + '[' + ई + '] = '+ this.id); }); }); वापसी array.join (' &'); } }) (jQuery); – waheed

+2

अपना उत्तर संपादित करें, टिप्पणियों में कोड पोस्ट न करें। –

संबंधित मुद्दे