Последовательный выбор

InstantCMS 2.X

Как прикрутить последовательный выбор к форме

#1 3 января 2017 в 12:40
Здравствуйте!
Объясните, пожалуйста, как прикрутить к форме последовательный выбор категорий. Вывести в нужном месте получилось, но вот как и куда передать значение последнего селекта я не знаю.
#2 3 января 2017 в 13:38

но вот как и куда передать значение последнего селекта я не знаю.

DCDozer
А чего его передавать? Он сам передастся и выведется на странице, если всё правильно сделали.
#3 3 января 2017 в 14:36


но вот как и куда передать значение последнего селекта я не знаю.

DCDozer
А чего его передавать? Он сам передастся и выведется на странице, если всё правильно сделали.

Lora
Скажите, что я делаю неправильно?
В файле /templates/мой_шаблон/assets/ui/form.tpl.php подключаю файл myselect.php
  1. // Если выполняется следующее условие, то вместо кода, который содержится между тегами
  2. // <fieldset></fieldset> исполняем код из подключаемого файла myselect.php
  3. if ($board == true && $fieldset['title'] == 'Категория'){ include('myselect.php'); } else {
  1. <div id="tab-<?php echo $fieldset_id; ?>" class="tab" <?php if($form->is_tabbed && $index){ ?>style="display: none;"<?php } ?>>
  2. <fieldset id="fset_<?php echo $fieldset_id; ?>"
  3. <?php if (isset($fieldset['class'])){ ?>class="<?php echo $fieldset['class']; ?>"<?php } ?>
  4. <?php if (isset($fieldset['is_hidden'])){ ?>style="display:none"<?php } ?>>
  5. <?php if (!empty($fieldset['title']) && !$form->is_tabbed){ ?>
  6. <legend><?php echo $fieldset['title']; ?></legend>
  7. <?php } ?>
  8. <?php
  9. $content_model = cmsCore::getModel('content');
  10. $categories = $content_model->getCategoriesTree('board', true);
  11. $arr_cat = array();
  12. if (is_array($categories)){
  13. foreach($categories as $item_cat){
  14. $arr_cat[$item_cat['id']] = array('id' => $item_cat['id'],'parent_id' => $item_cat['parent_id'], 'title' => $item_cat['title']);
  15. }
  16. }
  17. $parent_id = 1;
  18. $categories_list = array_categories_to_list($arr_cat, $parent_id);
  19. ?>
  20. <div id="f_category_id" class="field ft_list">
  21. <div>
  22. <select id="first_select" data-placeholder="Выберите категорию" onchange="newList(this.value);">
  23. <option value="" selected></option>
  24. <?php
  25. foreach($categories_list as $item_cat_list){
  26. if (!empty($item_cat_list['id'])&&!empty($item_cat_list['title'])){
  27. $id = $item_cat_list['id'];
  28. $title = $item_cat_list['title'];
  29. $html = "\t".'<option value = "'.htmlspecialchars($id).'">'.htmlspecialchars($title).'</option>'."\n";
  30. echo $html;
  31. }
  32. }
  33. ?>
  34. </select>
  35. <script type="text/javascript">$('#first_select').chosen({disable_search_threshold: 8, width: '100%', allow_single_deselect: true});</script>
  36. </div>
  37. <!-- Здесь, если это необходимо, будут добавляться дивы с селектами -->
  38. </div>
  39. </fieldset>
  40. </div>
#4 3 января 2017 в 21:29
Просто видно я не понял о чём речь. Сори. Судя по скрину вы создали поле "На длительный срок", как я понял типа-список. Это понятно. И что теперь нужно? Вывести его при определённых условиях или что? Файл myselect.php для чего?
#5 4 января 2017 в 01:44


Просто видно я не понял о чём речь. Сори. Судя по скрину вы создали поле "На длительный срок", как я понял типа-список. Это понятно. И что теперь нужно? Вывести его при определённых условиях или что? Файл myselect.php для чего?

Lora
Когда имеется большое количество категорий, то с выбором нужной могут возникнуть сложности, так как выбирать приходится из общего списка.
Поэтому я решил сделать последовательный выбор категорий. После загрузки страницы в форме имеем один селект со списком родительских категорий, после выбора нужной появляется второй селект с дочерними категориями и так до тех пор, пока не будет выбрана категория последнего уровня вложенности.
Проблема заключается в том, что прикрутить все это к форме я прикрутил, все выводится, все выбирается, но при нажатии на кнопку "Сохранить" появляется сообщение "Найдены ошибки в форме". Полагаю, что просто добавить селекты в шаблон недостаточно.
#6 4 января 2017 в 11:54
А покажите ф-цию newList(). Вроде у вас с кодом что то не так, если эта ф-ция отправляет запрос.
#8 1 февраля 2017 в 14:38


DCDozer, Evanescence знает что нужно сделать

Loadырь
Здравствуйте!
Мне тоже нужен подобный выбор категорий при добавлении объявления на сайте. Вы не знаете продается ли он отдельно от компонента Evanescence? Я к сожалению пока не могу написать там куда вы дали ссылку. Кармы не хватает.
#9 7 августа 2017 в 16:54

Мне тоже нужен подобный выбор категорий при добавлении объявления на сайте.

vladimird
vladimird, если еще актуально, то вот небольшой хак. Последовательный выбор категорий реализовал уже давно, правда пришлось писать функцию-костыль, чтобы работало как надо. Но не смотря на это, при определенных условиях не помогал и этот костыль.
И вот совсем недавно нашел время, чтобы все довести до ума (с моей непрофессиональной точки зрения).
Итак, в файле /templates/ваш_шаблон/assets/ui/form.tpl.php в самом начале определяем местоположение. Если находимся на странице добавления того контента, в котором требуется последовательный выбор категорий, то далее подключаем этот последовательный выбор.
  1.  
  2. // Определяем местоположение. Если находимся на странице добавления объявлений,
  3. // то в переменную $board будет записано какое-то положительное число,
  4. // если это страница добавления другого контента, запишется "0".
  5. $uri = cmsCore::getInstance()->uri_absolute;
  6. $board = (strpos($uri, 'board'));
  7.  
Далее в этом же файле ищем строку
  1. <?php echo $field->getInput($value); ?>
и заменяем ее этим кодом
  1.  
  2. <?php
  3. if ($board > 0 && $name == 'category_id') {include('dependent_lists.php'); }
  4. else echo $field->getInput($value);
  5. ?>
  6.  
Сам файл /templates/ваш_шаблон/assets/ui/dependent_lists.php здесь. В нем нужно найти строку
  1. url: "/ads/categories", // Ссылка на action
где ads — контроллер, categories — экшен. Здесь вместо "ads" нужно вставить название какого-то своего контроллера, а в папке
/system/controllers/ваш_контроллер/actions создать файл categories.php со следующим содержимым
  1.  
  2. <?php
  3.  
  4. class actionAdsCategories extends cmsAction {
  5.  
  6. public function run() {
  7.  
  8. $categories_list = NULL;
  9. if (!isset($_POST['parent_id']) || !$_POST['parent_id']) {
  10. exit("Нет данных определяющих тип запроса");
  11. }
  12. else {
  13. $parent_id = trim($_POST['parent_id']);
  14. $content_model = cmsCore::getModel('content');
  15. $categories = $content_model->getCategoriesTree('board', true);
  16. $arr_cat = array();
  17. if (is_array($categories)){
  18. foreach($categories as $item_cat){
  19. $arr_cat[$item_cat['id']] = array('id' => $item_cat['id'], 'parent_id' => $item_cat['parent_id'], 'title' => $item_cat['title']);
  20. }
  21. }
  22. $categories_list = array_categories_to_list($arr_cat, $parent_id);
  23. }
  24. echo json_encode($categories_list);
  25. die();
  26. }
  27. }
  28. ?>
  29.  
В названии класса вместо "Ads" вставляете название своего контроллера.
В файл /templates/ваш_шаблон/assets/helper.php дописываем функцию array_categories_to_list

  1.  
  2. function array_categories_to_list($categories, $filter){
  3.  
  4. $list = array();
  5. if (is_array($categories)){
  6. $i = 0;
  7. foreach($categories as $item){
  8. if ($item['parent_id'] == $filter) {
  9. $list[$i+1] = array('id' => $item['id'], 'title' => $item['title']);
  10. $i++;
  11. }
  12. }
  13. $list[0] = array('count' => $i);
  14. }
  15. return $list;
  16. }
  17.  
#10 7 августа 2017 в 17:03
DCDozer, тут есть бескостыльное решение, правда дорого берут smile.
#12 7 августа 2017 в 17:12


DCDozer, тут есть бескостыльное решение, правда дорого берут smile.

Loadырь
Ну, мне уже не надо. Работает как надо. smile
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.