Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Autocomplete, catcomplete
Форумы портала PHP.SU » PHP » Программирование на PHP » Autocomplete, catcomplete

Страниц (3): [1] 2 3 »
 

1. puncake - 20 Июня, 2016 - 15:53:48 - перейти к сообщению
Всем доброго здоровья! Сделала "живой поиск" с использованием виджета catcomplete, как описано вот здесь: https://jqueryui.com/autocomplete/#categories. Все почти получилось, только вместо названий категорий пишет undefined и все выбранные из БД тайтлы из двух таблиц вперемешку. Подскажите, кто знает, как это исправить. Спасибо заранее.
Сайт на CakePHP, если это важно.
2. Viper - 20 Июня, 2016 - 17:44:26 - перейти к сообщению
Код где?
3. puncake - 20 Июня, 2016 - 20:07:16 - перейти к сообщению
Viper пишет:
Код где?

CODE (javascript):
скопировать код в буфер обмена
  1. <script>
  2.   $.widget( "custom.catcomplete", $.ui.autocomplete, {
  3.     _create: function() {
  4.       this._super();
  5.       this.widget().menu( "option", "items", "> :not(.ui-autocomplete-category)" );
  6.     },
  7.     _renderMenu: function( ul, items ) {
  8.       var that = this,
  9.         currentCategory = "";
  10.       $.each( items, function( index, item ) {
  11.         var li;
  12.         if ( item.category != currentCategory ) {
  13.           ul.append( "<li class='ui-autocomplete-category'>" + item.category + "</li>" );
  14.           currentCategory = item.category;
  15.         }
  16.         li = that._renderItemData( ul, item );
  17.         if ( item.category ) {
  18.           li.attr( "aria-label", item.category + " : " + item.label );
  19.         }
  20.       });
  21.     }
  22.   });
  23.   </script>
  24. $( "#search" ).catcomplete({
  25.       source: path + '/article/search/',
  26.       minLength: 1,
  27.         select: function(event, ui){
  28.             window.location = path + item.category + ui.item.value;
  29.         }
  30.     });

PHP:
скопировать код в буфер обмена
  1. class ArticlesController extends AppController{
  2.    
  3.     public $uses = array('Category', 'Article', 'Recipe');
  4.  
  5. public function search(){
  6.         if(isset($_GET['term'])){
  7.            $result_search = $this->search_autocomplete();
  8.            exit(json_encode($result_search));
  9.         }elseif(isset($_GET['search']) && $_GET['search']){
  10.             $search = !empty($_GET['search']) ? $_GET['search'] : null;
  11.             $this->search_simple($search);
  12.         }
  13.     }
  14.    
  15.     public function search_autocomplete(){
  16.         $search = $_GET['term'];
  17.         $search_res = $this->Article->find('list', array(
  18.                 'conditions' => array("Article.title LIKE" => '%' . $search . '%', "Article.is_visible" => '1'),
  19.                 'fields' => array('title'),
  20.                 'limit' => 20
  21.             ));
  22.        
  23.         foreach($search_res as $k => $v){
  24.             $data[$k] = array('label' => $v, 'value' => $k);
  25.         }
  26.             return $data;
  27.     }
  28.  
  29. }


Я не совсем понимаю логику скрипта. Несмотря на то, что в search_autocomplete() прописана выборка только через модель Article, а значит из таблицы articles, выбираются также названия из таблицы recipes. Это хорошо, как раз то, что нужно. Ноя не понимаю, как так получается.
4. Viper - 20 Июня, 2016 - 22:01:36 - перейти к сообщению
Дебаг...
puncake пишет:
из БД тайтлы из двух таблиц вперемешку.
что выводит прямой GET-запрос? Данные в перемешку? Если да то проблема с логикой метода search, если нет, то нужно смотреть что приезжает в JS. Конкретно в renderMenu что говорит и показывает console.log(items); ? Консоль по F12

И да что за метод search_simple()?
5. puncake - 27 Июня, 2016 - 11:09:25 - перейти к сообщению
При прямом GET-запросе как-раз отрабатывает метод search_simple() и выводит результаты поиска.
PHP:
скопировать код в буфер обмена
  1. public function search_simple($search){        
  2.         if(is_null($search)){
  3.             return $this->set('search_res', 'Введите поисковый запрос...');
  4.         }        
  5.          $this->Paginator->settings = array(
  6.                 'conditions' => array("Article.title LIKE" => '%' . $search . '%', "Article.is_visible" => '1'),
  7.                 'fields' => array('id', 'title', 'img', 'announce', 'Category.id', 'Category.title'),
  8.                 'limit' => 12
  9.             );
  10.             $search_res = $this->Paginator->paginate('Article');
  11.             return $this->set(compact('search_res'));
  12.             $this->render(false);
  13.     }

Данные вперемешку - это имелись в виду тайтлы в выпадающем списке в catcomplete(); Там по идее должно идти название категории заголовком, потом тайтлы товара, затем название второй категории и после тайтлы из этой категории. Но у меня выходят тайтлы вперемешку из обеих категорий, а вместо названия категории (причем только одной) - undefined.
В консоли приходит JSON: список всех тайтлов + их айди, причем все это отсортировано по айди. Поэтому они вперемешку, я так понимаю.
И еще не знаю, как делать выборку из двух таблиц. Есть 2 таблицы: articles и recipes. В зависимости от категории выбранного из выпадающего списка тайтла нужно выбирать данные из одной из этих таблиц. Пока получается только из articles. Нужно, чтобы в скрипт вот сюда:
PHP:
скопировать код в буфер обмена
  1. $( "#search" ).catcomplete({
  2.       source: path + '/articles/search/',
  3.       minLength: 1,
  4.         select: function(event, ui){
  5.             window.location = path + item.category + ui.item.value;
  6.         }
  7.     });

вместо articles подставлялась категория выбранного тайтла. Это item.category. Но не получается. Если вставлю так:
PHP:
скопировать код в буфер обмена
  1. source: path + '/' + item.category + '/search/',

catcomplete не работает. Помогите, пожалуйста.
6. Viper - 27 Июня, 2016 - 15:16:40 - перейти к сообщению
В search_simple() не имеет смысла $this->render(false); после return.

JSON-ответ в студию!
7. puncake - 27 Июня, 2016 - 22:46:34 - перейти к сообщению
Viper пишет:
В search_simple() не имеет смысла $this->render(false); после return.

JSON-ответ в студию!

Вот это то, что в консоли
8. Viper - 27 Июня, 2016 - 23:31:26 - перейти к сообщению
У вас нет в ответе 'category', а вы его пытаетесь получить через item.category. Исправляйте search_autocomplete()

PHP:
скопировать код в буфер обмена
  1. ...
  2. $data[$k] = array('label' => $v, 'value' => $k, 'category' => $category);
  3. ...

вам осталось каким-то образом заполнить данными переменную $category. Кода вашего я не вижу полностью, поэтому не могу сказать как это сделать.
9. puncake - 12 Июля, 2016 - 14:09:37 - перейти к сообщению
Viper пишет:
У вас нет в ответе 'category', а вы его пытаетесь получить через item.category. Исправляйте search_autocomplete()

PHP:
скопировать код в буфер обмена
  1. ...
  2. $data[$k] = array('label' => $v, 'value' => $k, 'category' => $category);
  3. ...

вам осталось каким-то образом заполнить данными переменную $category.


Так не работает. Не придумывается, как вытащить категорию. Я изменила цикл:
PHP:
скопировать код в буфер обмена
  1. foreach($search_res as $item){
  2.             $data[$item['Article']['id']] = array('label' => $item['Article']['id'], 'value' => $item['Article']['title'], 'category' => $item['Article']['category_id']);
  3.         }
  4.         return $data;

А к запросе вытаскиваю айди категории. Но тоже не работает.
Viper пишет:
Кода вашего я не вижу полностью, поэтому не могу сказать как это сделать.

Я вроде весь нужный код в самом начале выложила. Что еще нужно, скажите - я выложу.
10. Viper - 12 Июля, 2016 - 15:03:24 - перейти к сообщению
http://jqueryui[dot]com/autocomplete/#categories жмакаете view source и смотрите формат
CODE (javascript):
скопировать код в буфер обмена
  1.     data = [
  2.       { label: "anders", category: "" },
  3.       { label: "andreas", category: "" },
  4.       { label: "antal", category: "" },
  5.       { label: "annhhx10", category: "Products" },
  6.       { label: "annk K12", category: "Products" },
  7.       { label: "annttop C13", category: "Products" },
  8.       { label: "anders andersson", category: "People" },
  9.       { label: "andreas andersson", category: "People" },
  10.       { label: "andreas johnson", category: "People" }
  11.     ];


У вас же вывод совсем другой получается.
11. puncake - 12 Июля, 2016 - 17:39:09 - перейти к сообщению
Viper пишет:
http://jqueryui[dot]com/autocomplete/#categories жмакаете view source и смотрите формат
CODE (javascript):
скопировать код в буфер обмена
  1.     data = [
  2.       { label: "anders", category: "" },
  3.       { label: "andreas", category: "" },
  4.       { label: "antal", category: "" },
  5.       { label: "annhhx10", category: "Products" },
  6.       { label: "annk K12", category: "Products" },
  7.       { label: "annttop C13", category: "Products" },
  8.       { label: "anders andersson", category: "People" },
  9.       { label: "andreas andersson", category: "People" },
  10.       { label: "andreas johnson", category: "People" }
  11.     ];


У вас же вывод совсем другой получается.

Я туда жмакала - я ведь оттуда код брала. Ясное дело, что у меня другой вывод. У меня ведь данные берутся из БД. Вот как из них построить такой вывод? Я data заполняю в цикле foreach. Но как-то у меня иначе получается.
12. Viper - 12 Июля, 2016 - 18:24:05 - перейти к сообщению
Только без категории.
PHP:
скопировать код в буфер обмена
  1. $data = array();
  2.  
  3. foreach ($search_res as $item) {
  4.         $data[] = (object) array(
  5.                 'label' => $item['Article']['id'],
  6.                 'value' => $item['Article']['title'],
  7.                 'category' => $item['Article']['category_id']
  8.         );
  9. }


Как получить название категории решайте сами.
13. puncake - 12 Июля, 2016 - 20:23:06 - перейти к сообщению
Viper пишет:
Только без категории.
PHP:
скопировать код в буфер обмена
  1. $data = array();
  2.  
  3. foreach ($search_res as $item) {
  4.         $data[] = (object) array(
  5.                 'label' => $item['Article']['id'],
  6.                 'value' => $item['Article']['title'],
  7.                 'category' => $item['Article']['category_id']
  8.         );
  9. }


Как получить название категории решайте сами.


К сожалению, теперь автокомплит не работает вообще, т.е. выпадающего списка тайтлов нет.
14. Viper - 12 Июля, 2016 - 21:24:40 - перейти к сообщению
puncake пишет:
К сожалению, теперь автокомплит не работает вообще, т.е. выпадающего списка тайтлов нет.
даже не знаю что и сказать. Массив теперь точно как из примера.
15. puncake - 08 Августа, 2016 - 10:29:38 - перейти к сообщению
Вопрос остается открытым. Пожалуйста, подскажите, кто знает, как решить проблему.

 

Powered by ExBB FM 1.0 RC1