class DbtngExampleUpdateForm

Same name and namespace in other branches
  1. 4.0.x modules/dbtng_example/src/Form/DbtngExampleUpdateForm.php \Drupal\dbtng_example\Form\DbtngExampleUpdateForm

Sample UI to update a record.

Hierarchy

Expanded class hierarchy of DbtngExampleUpdateForm

Related topics

1 string reference to 'DbtngExampleUpdateForm'
dbtng_example.routing.yml in modules/dbtng_example/dbtng_example.routing.yml
modules/dbtng_example/dbtng_example.routing.yml

File

modules/dbtng_example/src/Form/DbtngExampleUpdateForm.php, line 15

Namespace

Drupal\dbtng_example\Form
View source
class DbtngExampleUpdateForm extends FormBase {
    
    /**
     * Our database repository service.
     *
     * @var \Drupal\dbtng_example\DbtngExampleRepository
     */
    protected $repository;
    
    /**
     * {@inheritdoc}
     */
    public function getFormId() {
        return 'dbtng_update_form';
    }
    
    /**
     * {@inheritdoc}
     */
    public static function create(ContainerInterface $container) {
        $form = new static($container->get('dbtng_example.repository'));
        $form->setStringTranslation($container->get('string_translation'));
        $form->setMessenger($container->get('messenger'));
        return $form;
    }
    
    /**
     * Construct the new form object.
     */
    public function __construct(DbtngExampleRepository $repository) {
        $this->repository = $repository;
    }
    
    /**
     * Sample UI to update a record.
     */
    public function buildForm(array $form, FormStateInterface $form_state) {
        // Wrap the form in a div.
        $form = [
            '#prefix' => '<div id="updateform">',
            '#suffix' => '</div>',
        ];
        // Add some explanatory text to the form.
        $form['message'] = [
            '#markup' => $this->t('Demonstrates a database update operation.'),
        ];
        // Query for items to display.
        $entries = $this->repository
            ->load();
        // Tell the user if there is nothing to display.
        if (empty($entries)) {
            $form['no_values'] = [
                '#value' => $this->t('No entries exist in the table dbtng_example table.'),
            ];
            return $form;
        }
        $keyed_entries = [];
        $options = [];
        foreach ($entries as $entry) {
            $options[$entry->pid] = $this->t('@pid: @name @surname (@age)', [
                '@pid' => $entry->pid,
                '@name' => $entry->name,
                '@surname' => $entry->surname,
                '@age' => $entry->age,
            ]);
            $keyed_entries[$entry->pid] = $entry;
        }
        // Grab the pid.
        $pid = $form_state->getValue('pid');
        // Use the pid to set the default entry for updating.
        $default_entry = !empty($pid) ? $keyed_entries[$pid] : $entries[0];
        // Save the entries into the $form_state. We do this so the AJAX callback
        // doesn't need to repeat the query.
        $form_state->setValue('entries', $keyed_entries);
        $form['pid'] = [
            '#type' => 'select',
            '#options' => $options,
            '#title' => $this->t('Choose entry to update'),
            '#default_value' => $default_entry->pid,
            '#ajax' => [
                'wrapper' => 'updateform',
                'callback' => [
                    $this,
                    'updateCallback',
                ],
            ],
        ];
        $form['name'] = [
            '#type' => 'textfield',
            '#title' => $this->t('Updated first name'),
            '#size' => 15,
            '#default_value' => $default_entry->name,
        ];
        $form['surname'] = [
            '#type' => 'textfield',
            '#title' => $this->t('Updated last name'),
            '#size' => 15,
            '#default_value' => $default_entry->surname,
        ];
        $form['age'] = [
            '#type' => 'textfield',
            '#title' => $this->t('Updated age'),
            '#size' => 4,
            '#default_value' => $default_entry->age,
            '#description' => $this->t('Values greater than 127 will cause an exception'),
        ];
        $form['submit'] = [
            '#type' => 'submit',
            '#value' => $this->t('Update'),
        ];
        return $form;
    }
    
    /**
     * AJAX callback handler for the pid select.
     *
     * When the pid changes, populates the defaults from the database in the form.
     */
    public function updateCallback(array $form, FormStateInterface $form_state) {
        // Gather the DB results from $form_state.
        $entries = $form_state->getValue('entries');
        // Use the specific entry for this $form_state.
        $entry = $entries[$form_state->getValue('pid')];
        // Setting the #value of items is the only way I was able to figure out
        // to get replaced defaults on these items. #default_value will not do it
        // and shouldn't.
        foreach ([
            'name',
            'surname',
            'age',
        ] as $item) {
            $form[$item]['#value'] = $entry->{$item};
        }
        return $form;
    }
    
    /**
     * {@inheritdoc}
     */
    public function validateForm(array &$form, FormStateInterface $form_state) {
        // Confirm that age is numeric.
        if (!intval($form_state->getValue('age'))) {
            $form_state->setErrorByName('age', $this->t('Age needs to be a number'));
        }
    }
    
    /**
     * {@inheritdoc}
     */
    public function submitForm(array &$form, FormStateInterface $form_state) {
        // Gather the current user so the new record has ownership.
        $account = $this->currentUser();
        // Save the submitted entry.
        $entry = [
            'pid' => $form_state->getValue('pid'),
            'name' => $form_state->getValue('name'),
            'surname' => $form_state->getValue('surname'),
            'age' => $form_state->getValue('age'),
            'uid' => $account->id(),
        ];
        $count = $this->repository
            ->update($entry);
        $this->messenger()
            ->addMessage($this->t('Updated entry @entry (@count row updated)', [
            '@count' => $count,
            '@entry' => print_r($entry, TRUE),
        ]));
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title Overrides
DbtngExampleUpdateForm::$repository protected property Our database repository service.
DbtngExampleUpdateForm::buildForm public function Sample UI to update a record. Overrides FormInterface::buildForm
DbtngExampleUpdateForm::create public static function Instantiates a new instance of this class. Overrides FormBase::create
DbtngExampleUpdateForm::getFormId public function Returns a unique string identifying the form. Overrides FormInterface::getFormId
DbtngExampleUpdateForm::submitForm public function Form submission handler. Overrides FormInterface::submitForm
DbtngExampleUpdateForm::updateCallback public function AJAX callback handler for the pid select.
DbtngExampleUpdateForm::validateForm public function Form validation handler. Overrides FormBase::validateForm
DbtngExampleUpdateForm::__construct public function Construct the new form object.
DependencySerializationTrait::$_entityStorages protected property
DependencySerializationTrait::$_serviceIds protected property
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
FormBase::$configFactory protected property The config factory. 3
FormBase::$requestStack protected property The request stack. 1
FormBase::$routeMatch protected property The route match.
FormBase::config protected function Retrieves a configuration object.
FormBase::configFactory protected function Gets the config factory for this form. 3
FormBase::container private function Returns the service container.
FormBase::currentUser protected function Gets the current user.
FormBase::getRequest protected function Gets the request object.
FormBase::getRouteMatch protected function Gets the route match.
FormBase::logger protected function Gets the logger for a specific channel.
FormBase::redirect protected function Returns a redirect response object for the specified route.
FormBase::resetConfigFactory public function Resets the configuration factory.
FormBase::setConfigFactory public function Sets the config factory for this form.
FormBase::setRequestStack public function Sets the request stack object to use.
LoggerChannelTrait::$loggerFactory protected property The logger channel factory service.
LoggerChannelTrait::getLogger protected function Gets the logger for a specific channel.
LoggerChannelTrait::setLoggerFactory public function Injects the logger channel factory.
MessengerTrait::$messenger protected property The messenger. 17
MessengerTrait::messenger public function Gets the messenger. 17
MessengerTrait::setMessenger public function Sets the messenger.
RedirectDestinationTrait::$redirectDestination protected property The redirect destination service. 1
RedirectDestinationTrait::getDestinationArray protected function Prepares a &#039;destination&#039; URL query parameter for use with \Drupal\Core\Url.
RedirectDestinationTrait::getRedirectDestination protected function Returns the redirect destination service.
RedirectDestinationTrait::setRedirectDestination public function Sets the redirect destination service.
StringTranslationTrait::$stringTranslation protected property The string translation service. 3
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.