/** * Set the form model object from the builder's model. * * @param SetDefaultParameters $command */ public function handle() { /* * Set the form mode according * to the builder's entry. */ if (!$this->builder->getFormMode()) { $this->builder->setFormMode($this->builder->getFormEntryId() || $this->builder->getEntry() ? 'edit' : 'create'); } /* * Next we'll loop each property and look for a handler. */ $reflection = new \ReflectionClass($this->builder); /* @var \ReflectionProperty $property */ foreach ($reflection->getProperties(\ReflectionProperty::IS_PROTECTED) as $property) { if (in_array($property->getName(), $this->skips)) { continue; } /* * If there is no getter then skip it. */ if (!method_exists($this->builder, $method = 'get' . ucfirst($property->getName()))) { continue; } /* * If the parameter already * has a value then skip it. */ if ($this->builder->{$method}()) { continue; } /* * Check if we can transform the * builder property into a handler. * If it exists, then go ahead and use it. */ $handler = str_replace('FormBuilder', 'Form' . ucfirst($property->getName()), get_class($this->builder)); if (class_exists($handler)) { /* * Make sure the handler is * formatted properly. */ if (!str_contains($handler, '@')) { $handler .= '@handle'; } $this->builder->{'set' . ucfirst($property->getName())}($handler); continue; } /* * If the handler does not exist and * we have a default handler, use it. */ if ($default = array_get($this->defaults, $property->getName())) { $this->builder->{'set' . ucfirst($property->getName())}($default); } } }
/** * Handle the command. * * @param Container $container * @param ViewTemplate $template * @param BreadcrumbCollection $breadcrumbs */ public function handle(Container $container, ViewTemplate $template, BreadcrumbCollection $breadcrumbs) { $form = $this->builder->getForm(); if ($handler = $form->getOption('data')) { $container->call($handler, compact('form')); } if ($layout = $form->getOption('layout_view')) { $template->put('layout', $layout); } if ($title = $form->getOption('title')) { $template->put('title', $title); } // Move this to options so we can read it. $this->builder->setFormOption('read_only', $this->builder->isReadOnly()); $form->addData('form', $form); if ($breadcrumb = $form->getOption('breadcrumb', 'streams::form.mode.' . $this->builder->getFormMode())) { $breadcrumbs->put($breadcrumb, '#'); } }
/** * Default the form actions when none are defined. * * @param FormBuilder $builder */ public function defaults(FormBuilder $builder) { if ($builder->getActions() === []) { if ($builder->getFormMode() == 'create') { $builder->setActions(['save', 'save_create']); } else { $builder->setActions(['update', 'save_exit']); } } }
/** * Guess the field instructions. * * @param FormBuilder $builder */ public function guess(FormBuilder $builder) { $fields = $builder->getFields(); $mode = $builder->getFormMode(); foreach ($fields as &$field) { // Guess based on the form mode if applicable. if (in_array((string) ($disabled = array_get($field, 'disabled', null)), ['create', 'edit'])) { $field['disabled'] = $disabled === $mode; } } $builder->setFields($fields); }
/** * Guess the action's enabled parameter. * * @param FormBuilder $builder */ public function guess(FormBuilder $builder) { $actions = $builder->getActions(); $mode = $builder->getFormMode(); foreach ($actions as &$action) { if (isset($action['enabled']) && is_bool($action['enabled'])) { return; } if (isset($action['enabled']) && is_string($action['enabled'])) { $action['enabled'] = $mode === $action['enabled']; } } $builder->setActions($actions); }
/** * Guess the HREF for a button. * * @param FormBuilder $builder */ public function guess(FormBuilder $builder) { $buttons = $builder->getButtons(); $mode = $builder->getFormMode(); foreach ($buttons as &$button) { if (!isset($button['enabled'])) { continue; } if (is_bool($button['enabled'])) { continue; } $button['enabled'] = $mode === $button['enabled']; } $builder->setButtons($buttons); }
/** * Guess the HREF for a button. * * @param FormBuilder $builder */ public function guess(FormBuilder $builder) { $buttons = $builder->getButtons(); $mode = $builder->getFormMode(); foreach ($buttons as &$button) { if (isset($button['enabled']) && is_bool($button['enabled'])) { return; } switch (array_get($button, 'button')) { case 'delete': $button['enabled'] = $mode === 'edit'; break; } } $builder->setButtons($buttons); }
/** * Guess some some form action parameters. * * @param FormBuilder $builder */ public function guess(FormBuilder $builder) { $actions = $builder->getActions(); $section = $this->sections->active(); reset($actions); $first = key($actions); foreach ($actions as $key => &$action) { // If we already have an HREF then skip it. if (isset($action['redirect'])) { continue; } if ($key == $first && ($redirect = $builder->getOption('redirect'))) { $action['redirect'] = $redirect; continue; } // Determine the HREF based on the action type. switch (array_get($action, 'action')) { case 'save': case 'submit': case 'save_exit': $action['redirect'] = $section ? $section->getHref() : $this->request->fullUrl(); break; case 'update': case 'save_edit': case 'save_continue': $action['redirect'] = function () use($section, $builder) { if ($section && $builder->getFormMode() == 'create') { return $section->getHref('edit/' . $builder->getContextualId()); } return $this->request->fullUrl(); }; break; case 'save_edit_next': $ids = array_filter(explode(',', $builder->getRequestValue('edit_next'))); if (!$ids) { $action['redirect'] = $section ? $section->getHref() : $this->request->fullUrl(); } elseif (count($ids) == 1) { $action['redirect'] = $section ? $section->getHref('edit/' . array_shift($ids)) : $this->request->fullUrl(); } else { $action['redirect'] = $section ? $section->getHref('edit/' . array_shift($ids) . '?' . $builder->getOption('prefix') . 'edit_next=' . implode(',', $ids)) : $this->request->fullUrl(); } break; } } $builder->setActions($actions); }
/** * Guess the field required flag. * * @param FormBuilder $builder */ public function guess(FormBuilder $builder) { $fields = $builder->getFields(); $mode = $builder->getFormMode(); $entry = $builder->getFormEntry(); foreach ($fields as &$field) { // Guess based on the assignment if possible. if (!isset($field['required']) && $entry instanceof EntryInterface && ($assignment = $entry->getAssignment($field['field']))) { $field['required'] = array_get($field, 'required', $assignment->isRequired()); } // Guess based on the form mode if applicable. if (in_array($required = array_get($field, 'required'), ['create', 'edit'])) { $field['required'] = $required === $mode; } // Guess based on the rules. if (in_array('required', array_get($field, 'rules', []))) { $field['required'] = true; } } $builder->setFields($fields); }
/** * Guess some some form action parameters. * * @param FormBuilder $builder */ public function guess(FormBuilder $builder) { $actions = $builder->getActions(); $section = $this->sections->active(); reset($actions); $first = key($actions); foreach ($actions as $key => &$action) { /* * If we already have an * HREF then skip it. */ if (isset($action['redirect'])) { continue; } /* * If this is the first action and the * form builder has a redirect option * then use it for the action redirect. */ if ($key == $first && ($redirect = $builder->getOption('redirect'))) { $action['redirect'] = $redirect; continue; } /* * If we're not in admin then just assume we * need to head back to the form. No redirect * will redirect back in this case. */ if ($this->request->segment(1) !== 'admin') { continue; } // Determine the HREF based on the action type. switch (array_get($action, 'action')) { case 'save': case 'submit': case 'save_exit': $action['redirect'] = $section ? $section->getHref() : $this->request->fullUrl(); break; case 'save_create': $action['redirect'] = $this->request->fullUrl(); break; case 'update': case 'save_edit': case 'save_continue': $action['redirect'] = function () use($section, $builder) { if ($section && $builder->getFormMode() == 'create') { return $section->getHref('edit/' . $builder->getContextualId()); } return $this->request->fullUrl(); }; break; case 'save_edit_next': $ids = array_filter(explode(',', $builder->getRequestValue('edit_next'))); if (!$ids) { $action['redirect'] = $section ? $section->getHref() : $this->request->fullUrl(); } elseif (count($ids) == 1) { $action['redirect'] = $section ? $section->getHref('edit/' . array_shift($ids)) : $this->request->fullUrl(); } else { $action['redirect'] = $section ? $section->getHref('edit/' . array_shift($ids) . '?' . $builder->getOption('prefix') . 'edit_next=' . implode(',', $ids)) : $this->request->fullUrl(); } break; } } $builder->setActions($actions); }
/** * Handle the command. */ public function handle(MessageBag $messages, Translator $translator) { // If we can't save or there are errors then skip it. if ($this->builder->hasFormErrors() || !$this->builder->canSave()) { return; } // If there is no model and there isn't anything specific to say, skip it. if (!$this->builder->getFormEntry() && !$this->builder->getFormOption('success_message')) { return; } $mode = $this->builder->getFormMode(); // False means no message is desired. if ($this->builder->getFormOption('success_message') === false) { return; } $entry = $this->builder->getFormEntry(); $stream = $this->builder->getFormStream(); $parameters = ['title' => is_object($entry) ? $entry->getTitle() : null, 'name' => is_object($stream) ? $stream->getName() : null]; // If the name doesn't exist we need to be clever. if (str_contains($parameters['name'], '::') && !$translator->has($parameters['name']) && $stream) { $parameters['name'] = ucfirst(str_singular(str_replace('_', ' ', $stream->getSlug()))); } elseif ($parameters['name']) { $parameters['name'] = str_singular(trans($parameters['name'])); } else { $parameters['name'] = trans('streams::entry.name'); } /** * Set the default success message. */ if ($this->builder->getFormOption('success_message') === null) { $this->builder->setFormOption('success_message', trans('streams::message.' . $mode . '_success', $parameters)); } $messages->{$this->builder->getFormOption('success_message_type', 'success')}($this->builder->getFormOption('success_message')); }