/** * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state, $category = NULL) { //get category id from route values if (is_numeric(FaqHelper::arg(1))) { $category = FaqHelper::arg(1); } $order = $date_order = ''; $faq_settings = $this->config('faq.settings'); $use_categories = $faq_settings->get('use_categories'); if (!$use_categories) { $step = "order"; } elseif (!isset($form_state['values']) && empty($category)) { $step = "categories"; } else { $step = "order"; } $form['step'] = array('#type' => 'value', '#value' => $step); // Categorized q/a. if ($step == "categories") { // Get list of categories. $vocabularies = Vocabulary::loadMultiple(); $options = array(); foreach ($vocabularies as $vid => $vobj) { $tree = taxonomy_get_tree($vid); foreach ($tree as $term) { if (!FaqHelper::taxonomyTermCountNodes($term->tid)) { continue; } $options[$term->tid] = $this->t($term->name); $form['choose_cat']['faq_category'] = array('#type' => 'select', '#title' => t('Choose a category'), '#description' => t('Choose a category that you wish to order the questions for.'), '#options' => $options, '#multiple' => FALSE); $form['choose_cat']['search'] = array('#type' => 'submit', '#value' => t('Search'), '#submit' => array('faq_order_settings_choose_cat_form_submit')); } } } else { $default_sorting = $faq_settings->get('default_sorting'); $default_weight = 0; if ($default_sorting != 'DESC') { $default_weight = 1000000; } $options = array(); if (!empty($form_state['values']['faq_category'])) { $category = $form_state['values']['faq_category']; } // Uncategorized ordering. $query = db_select('node', 'n'); $query->join('node_field_data', 'd', 'n.nid = d.nid'); $query->fields('n', array('nid'))->fields('d', array('title'))->addTag('node_access')->condition('n.type', 'faq')->condition('d.status', 1); // Works, but involves variable concatenation - safe though, since // $default_weight is an integer. $query->addExpression("COALESCE(w.weight, {$default_weight})", 'effective_weight'); // Doesn't work in Postgres. //$query->addExpression('COALESCE(w.weight, CAST(:default_weight as SIGNED))', 'effective_weight', array(':default_weight' => $default_weight)); if (empty($category)) { $category = 0; $w_alias = $query->leftJoin('faq_weights', 'w', 'n.nid = %alias.nid AND %alias.tid = :category', array(':category' => $category)); $query->orderBy('effective_weight', 'ASC')->orderBy('d.sticky', 'DESC')->orderBy('d.created', $default_sorting == 'DESC' ? 'DESC' : 'ASC'); } else { $ti_alias = $query->innerJoin('taxonomy_index', 'ti', '(n.nid = %alias.nid)'); $w_alias = $query->leftJoin('faq_weights', 'w', 'n.nid = %alias.nid AND %alias.tid = :category', array(':category' => $category)); $query->condition('ti.tid', $category); $query->orderBy('effective_weight', 'ASC')->orderBy('d.sticky', 'DESC')->orderBy('d.created', $default_sorting == 'DESC' ? 'DESC' : 'ASC'); } $options = $query->execute()->fetchAll(); $form['weight']['faq_category'] = array('#type' => 'value', '#value' => $category); // Show table ordering form. $form['order_no_cats']['#tree'] = TRUE; $form['order_no_cats']['#theme'] = 'faq_draggable_question_order_table'; foreach ($options as $i => $record) { $form['order_no_cats'][$i]['nid'] = array('#type' => 'hidden', '#value' => $record->nid); $form['order_no_cats'][$i]['title'] = array('#markup' => String::checkPlain($record->title)); $form['order_no_cats'][$i]['sort'] = array('#type' => 'weight', '#delta' => count($options), '#default_value' => $i); } $form['actions']['#type'] = 'actions'; $form['actions']['submit'] = array('#type' => 'submit', '#value' => $this->t('Save order'), '#button_type' => 'primary'); } return $form; }