class OrderForm in Frequently Asked Questions 8
Form for reordering the FAQ-s.
Hierarchy
- class \Drupal\Core\Form\FormBase implements ContainerInjectionInterface, FormInterface uses DependencySerializationTrait, LoggerChannelTrait, MessengerTrait, LinkGeneratorTrait, RedirectDestinationTrait, UrlGeneratorTrait, StringTranslationTrait
- class \Drupal\Core\Form\ConfigFormBase uses ConfigFormBaseTrait
- class \Drupal\faq\Form\OrderForm
- class \Drupal\Core\Form\ConfigFormBase uses ConfigFormBaseTrait
Expanded class hierarchy of OrderForm
File
- src/
Form/ OrderForm.php, line 19
Namespace
Drupal\faq\FormView source
class OrderForm extends ConfigFormBase {
protected $entityTypeManager;
protected $languageManager;
protected $database;
/**
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager
* @param \Drupal\Core\Language\LanguageManagerInterface $languageManager
* @param \Drupal\Core\Database\Connection $database
*/
public function __construct(EntityTypeManagerInterface $entityTypeManager, LanguageManagerInterface $languageManager, Connection $database) {
$this->entityTypeManager = $entityTypeManager;
$this->languageManager = $languageManager;
$this->database = $database;
}
/**
* @param \Symfony\Component\DependencyInjection\ContainerInterface $container
* @return static
*/
public static function create(ContainerInterface $container) {
return new static($container
->get('entity_type.manager'), $container
->get('language_manager'), $container
->get('database'));
}
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'faq_order_form';
}
/**
* {@inheritdoc}
*/
protected function getEditableConfigNames() {
return [];
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state, $category = NULL) {
// Get category id from route values.
if ($id = FaqHelper::searchInArgs('faq-page')) {
$next_id = $id + 1;
// Check if we're on a categorized faq page.
if (is_numeric(FaqHelper::arg($next_id))) {
$category = FaqHelper::arg($next_id);
}
}
$order = $date_order = '';
$faq_settings = $this
->config('faq.settings');
$use_categories = $faq_settings
->get('use_categories');
if (!$use_categories) {
$step = "order";
}
elseif ($form_state
->getValues() != NULL && 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 = $this->entityTypeManager
->getStorage('taxonomy_term')
->loadTree($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
->getValue('faq_category'))) {
$category = $form_state
->getValue('faq_category');
}
$langcode = $this->languageManager
->getCurrentLanguage()
->getId();
// Uncategorized ordering.
$query = $this->database
->select('node', 'n');
$query
->join('node_field_data', 'd', 'n.nid = d.nid');
$query
->fields('n', [
'nid',
])
->fields('d', [
'title',
])
->condition('n.type', 'faq')
->condition('d.langcode', $langcode)
->condition('d.status', 1)
->addTag('node_access');
// 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;
$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 {
$query
->innerJoin('taxonomy_index', 'ti', '(n.nid = %alias.nid)');
$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' => Html::escape($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;
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
$order_no_cats = $form_state
->getValue('order_no_cats');
if ($form_state
->getValue('op')
->__toString() == t('Save order') && !empty($order_no_cats)) {
foreach ($order_no_cats as $i => $faq) {
$nid = $faq['nid'];
$index = $faq['sort'];
Database::getConnection()
->merge('faq_weights')
->fields(array(
'weight' => $index,
))
->keys(array(
'tid' => $form_state
->getValue('faq_category'),
'nid' => $nid,
))
->execute();
}
parent::submitForm($form, $form_state);
}
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
ConfigFormBaseTrait:: |
protected | function | Retrieves a configuration object. | |
DependencySerializationTrait:: |
protected | property | An array of entity type IDs keyed by the property name of their storages. | |
DependencySerializationTrait:: |
protected | property | An array of service IDs keyed by property name used for serialization. | |
DependencySerializationTrait:: |
public | function | 1 | |
DependencySerializationTrait:: |
public | function | 2 | |
FormBase:: |
protected | property | The config factory. | 1 |
FormBase:: |
protected | property | The request stack. | 1 |
FormBase:: |
protected | property | The route match. | |
FormBase:: |
protected | function | Gets the config factory for this form. | 1 |
FormBase:: |
private | function | Returns the service container. | |
FormBase:: |
protected | function | Gets the current user. | |
FormBase:: |
protected | function | Gets the request object. | |
FormBase:: |
protected | function | Gets the route match. | |
FormBase:: |
protected | function | Gets the logger for a specific channel. | |
FormBase:: |
protected | function |
Returns a redirect response object for the specified route. Overrides UrlGeneratorTrait:: |
|
FormBase:: |
public | function | Resets the configuration factory. | |
FormBase:: |
public | function | Sets the config factory for this form. | |
FormBase:: |
public | function | Sets the request stack object to use. | |
FormBase:: |
public | function |
Form validation handler. Overrides FormInterface:: |
62 |
LinkGeneratorTrait:: |
protected | property | The link generator. | 1 |
LinkGeneratorTrait:: |
protected | function | Returns the link generator. | |
LinkGeneratorTrait:: |
protected | function | Renders a link to a route given a route name and its parameters. | |
LinkGeneratorTrait:: |
public | function | Sets the link generator service. | |
LoggerChannelTrait:: |
protected | property | The logger channel factory service. | |
LoggerChannelTrait:: |
protected | function | Gets the logger for a specific channel. | |
LoggerChannelTrait:: |
public | function | Injects the logger channel factory. | |
MessengerTrait:: |
protected | property | The messenger. | 29 |
MessengerTrait:: |
public | function | Gets the messenger. | 29 |
MessengerTrait:: |
public | function | Sets the messenger. | |
OrderForm:: |
protected | property | ||
OrderForm:: |
protected | property | ||
OrderForm:: |
protected | property | ||
OrderForm:: |
public | function |
Form constructor. Overrides ConfigFormBase:: |
|
OrderForm:: |
public static | function |
Overrides ConfigFormBase:: |
|
OrderForm:: |
protected | function |
Gets the configuration names that will be editable. Overrides ConfigFormBaseTrait:: |
|
OrderForm:: |
public | function |
Returns a unique string identifying the form. Overrides FormInterface:: |
|
OrderForm:: |
public | function |
Form submission handler. Overrides ConfigFormBase:: |
|
OrderForm:: |
public | function |
Overrides ConfigFormBase:: |
|
RedirectDestinationTrait:: |
protected | property | The redirect destination service. | 1 |
RedirectDestinationTrait:: |
protected | function | Prepares a 'destination' URL query parameter for use with \Drupal\Core\Url. | |
RedirectDestinationTrait:: |
protected | function | Returns the redirect destination service. | |
RedirectDestinationTrait:: |
public | function | Sets the redirect destination service. | |
StringTranslationTrait:: |
protected | property | The string translation service. | 1 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. | |
UrlGeneratorTrait:: |
protected | property | The url generator. | |
UrlGeneratorTrait:: |
protected | function | Returns the URL generator service. | |
UrlGeneratorTrait:: |
public | function | Sets the URL generator service. | |
UrlGeneratorTrait:: |
protected | function | Generates a URL or path for a specific route based on the given parameters. |