Добавьте дополнительные <li>с каждой существующей первой буквой в значении предметов - PullRequest
0 голосов
/ 18 марта 2012

Чтобы иметь возможность использовать этот удивительный плагин: Jquery iphone contacts

Мне нужно обновить существующую разметку (обычный список):

<div id="iphone-scrollcontainer">
   <ul id="iphone-search">
       <li><a href="#A" title="A">A</a></li>
        <li><a href="#B" title="B">B</a></li>
        <li><a href="#C" title="C">C</a></li>
        <li><a href="#D" title="D">D</a></li>
        <li><a href="#E" title="E">E</a></li>
        <!-- More characters here -->
    </ul>
   <ul id="iphone-scroll">
            <li><a href="http://en.wikipedia.org/wiki/Amsterdam" title="Amsterdam"><strong>Amsterdam</strong>747,290</a></li>
             <li><a href="http://en.wikipedia.org/wiki/Amsterdam" title="Barcelona"><strong>Barcelona</strong>747,290</a></li>
             <li><a href="http://en.wikipedia.org/wiki/Amsterdam" title="Sevilla"><strong>Sevilla</strong>747,290</a></li>
             <li><a href="http://en.wikipedia.org/wiki/Amsterdam" title="Cadiz"><strong>Cadiz</strong>747,290</a></li>
   </ul>
</div>

Into (Добавить навигационные индикаторы):

<div id="iphone-scrollcontainer">
   <ul id="iphone-search">
       <li><a href="#A" title="A">A</a></li>
        <li><a href="#B" title="B">B</a></li>
        <li><a href="#C" title="C">C</a></li>
        <li><a href="#D" title="D">D</a></li>
        <li><a href="#E" title="E">E</a></li>
        <!-- More characters here -->
    </ul>
   <ul id="iphone-scroll">
      <li>
        <div id="nav-indicator-fixed"></div>
        <a name="A"></a>
      <div class="nav-indicator" id="nav-a">A</div>
         <ul>
            <li><a href="http://en.wikipedia.org/wiki/Amsterdam" title="Amsterdam"><strong>Amsterdam</strong>747,290</a></li>
            <li><a href="http://en.wikipedia.org/wiki/Arnhem" title="Arnhem"><strong>Arnhem</strong>144,101</a></li>
            <!-- More info here -->
         </ul>
      </li>
      <li>
        <a name="B"></a>
      <div class="nav-indicator" id="nav-b">B</div>
         <ul>
            <li><a href="http://en.wikipedia.org/wiki/Bolsward" title="Bolsward"><strong>Bolsward</strong>9,607</a></li>
            <li><a href="http://en.wikipedia.org/wiki/Buren" title="Buren"><strong>Buren</strong>25,644</a></li>
            <!-- More info here -->
         </ul>   
      </li>
   </ul>
</div>

Так что мне нужно

добавить:

 <div id="nav-indicator-fixed"></div>
            <a name="A"></a>
          <div class="nav-indicator" id="nav-a">A</div>
          <ul>

До предметов А и

</li></ul> после пунктов А (и то же самое для каждой существующей первой буквы), я прав?

Теперь, когда я не знаю, чтобы сделать это во внешнем интерфейсе, используя jquery, или если я могу сделать это на сервере, используя php

Я генерирую свою разметку простым запросом: «выберите название из списка городов по названию desc»

как и где бы вы это сделали?

(на самом деле плагин не имеет функции¿)

-EDIT-

php код был запрошен:

function nube_ingredientes($limit = 50){
    $query = "SELECT count(*) as num, nombre FROM ciudades WHERE GROUP BY nombre ORDER BY num DESC LIMIT $limit";

    $result = mysql_query($query);
        $html .= '<div class="content">';

            $html .=    '<ul>';
                while($taginfo = mysql_fetch_row($result)){
                     $numtags = $taginfo[0];
                     $tagname = $taginfo[1];
                     $tagurl = urlencode($tagname);
                     $tagsize = 9 + intval($numtags)*2;
                     $bla = 'get_items("'.str_replace(' ','-',$tagname).'")';
                     $tagname = str_replace('-', ' ', $tagname);
                      $html.= "<li><a href='#router' onclick='$bla' c='$numtags'>$tagname</a></li> "."\n";

                }
        $html .=    '</ul>
                  </div>';

        echo $html;
 }

Ответы [ 2 ]

2 голосов
/ 18 марта 2012

Я не проверял это, поэтому рассмотрим псевдо-код, однако он должен дать вам хорошую отправную точку. Идея состоит в том, чтобы проверять первую букву каждой строки, и, если она отличается от первой буквы предыдущей строки, выдать новый HTML-код. Всегда лучше выдавать HTML-код как можно ближе к финалу. Таким образом, это решение не имеет сложных изменений, необходимых для внешнего интерфейса.

function nube_ingredientes($limit = 50){
$query = "SELECT count(*) as num, nombre FROM ciudades WHERE GROUP BY nombre ORDER BY num DESC LIMIT $limit";

$result = mysql_query($query);
    $html .= '<div class="content">';
        $html .=    '<ul>';
            while($taginfo = mysql_fetch_row($result)){
                 $numtags = $taginfo[0];
                 $tagname = $taginfo[1];
                 $tagurl = urlencode($tagname);
                 $tagsize = 9 + intval($numtags)*2;
                 $bla = 'get_items("'.str_replace(' ','-',$tagname).'")';
                 $tagname = str_replace('-', ' ', $tagname);
                 $thisChar = strtoupper(substr($tagname, 0, 1)); //Added by msigman
                 if($lastChar != $thisChar);//Added by msigman
                 {
                    $html .= "<li><div id='nav-indicator-fixed'></div>
                    <a name='$thisChar'></a>
                    <div class='nav-indicator' id='nav-$thisChar'>$thisChar</div>
                    <ul>"; //Added by msigman
                  }
                 $html.= "<li><a href='#router' onclick='$bla' c='$numtags'>$tagname</a></li> "."\n";
                 if($lastChar != $thisChar); //Added by msigman
                 {
                    $lastChar = $thisChar; //Added by msigman
                    $html .= "</li></ul>"; //Added by msigman
                 }
            }
    $html .=    '</ul></div>';
    echo $html;

}

0 голосов
/ 18 марта 2012

Предполагая, что вы, возможно, захотите передать базовые данные клиенту без генерации разметки в php, вы можете сделать это следующим образом:

  1. Убедитесь, что ваш сервер доставляет данные в компактной форме.Поскольку вы сказали, что ваши данные представляют собой SQL-запрос, я предполагаю, что вы можете легко сбросить его с помощью encode_json($results) в PHP, который будет выглядеть примерно так:
// title, wiki-link, x-coord, y-coord
var data =
  [["Amsterdam", "Amsterdam", 747, 290],
   ["Barcelona", "Barcelona", 747, 290],
   ...
  ]

Я добавил вики-ссылку простов случае, если это не заголовок;)

Теперь, используя jQuery и underscore.js , вы можете сгенерировать свой контент с помощью нескольких строк кода:

// group your data by the first letter of the title
var grouped = _.groupBy(data, function(row) { 
  // row[0] is the title
  return row[0].substring(0, 1)
})
// generate the header
var letters = _.keys(grouped)
var header = $('<ul>', { id: 'iphone-search' })
_.each(letters, function(letter) {
  $('<a>', { href: '#' + letter, title: letter }).html(letter).appendTo(header)
})

// the scroll body
var scrollBody = $('<ul>', { id: 'iphone-scroll' })
_.each(letters, function(letter) {
  var li = $('<li>')
  // create the navigational anchor
  $('<a>', { name: letter }).appendTo(li)

  // create the div to put the ul/li... on
  var div = $('<div>', { 
    'class': 'nav-indicator',
    'id': 'nav-' + letter.toLowerCase()
  }).appendTo(li)
  var ul = $('<ul>').appendTo(div)
  _.each(grouped[letter], function(group) {
    // now, for each element within the group
    // create the <li><a>...</a></li> content
    $('<li>').append(
      $('<a>', {
        title: group[0],
        href: 'http://en.wikipedia.org/wiki/' + group[1] // the wiki-link
      }).append(
        $('<strong>').html(group[0])
      ).append(
        $('<span>').html(group[2] + ', ' + group[3])
      )
    ).appendTo(ul)
  })      
})

// now you can join them in the container
var container = 
  $('<div>', { id: 'iphone-scrollcontainer'}).append(header).append(scrollBody)

Это должновыдайте только тот HTML-код, который вы хотели;) Последняя часть выглядит немного грязной, но, по крайней мере, в том же стиле, что и все элементы, сгенерированные только jQuery.

...