Я пытаюсь создать простой модуль в pyrocms, и теперь я создаю общедоступную форму, в которую мы вводим имя и описание, но slug - это skipField и создается из имени. На данный момент мне нужно изменить "генератор слагов", чтобы добавить суффикс, например '-'.uniqid().
Мой код выглядит так:
public function save(AdvertFormBuilder $form)
{
$form->skipField('slug');
$form->setOption('redirect', 'dodaj-ogloszenie/potwierdzenie');
$form->setOption('redirect_error', 'dodaj-ogloszenie');
$form->build();
$form->validate();
if ($form->hasFormErrors()){
return redirect($form->getOption('redirect_error'));
}else{
$form->saveForm();
return redirect($form->getOption('redirect'));
}
...
Теперь мне нужно изменить этот слаг, например $_POST['name'].'-'.uniqid(). Я пробую это:
$form->getFormField('slug')->setValue($form->getFormField('name')->value.'-'.uniqid());
dd($form->getFormField('slug'));exit;
но это не работает :(
Обновление1
Файл потока:
/**
* The stream definition.
*
* @var array
*/
protected $stream = [
'slug' => 'adverts',
'title_column' => 'name',
'translatable' => true,
'trashable' => false,
'searchable' => false,
'sortable' => false,
];
/**
* The stream assignments.
*
* @var array
*/
protected $assignments = [
'name' => [
'translatable' => true,
'required' => true,
],
'slug' => [
'unique' => true,
'required' => true,
],
'category' => [
'required' => true,
],
];
и сформируем файл сборки:
/**
* The form fields.
*
* @var array|string
*/
protected $fields = [
'name' => [
'translatable' => true,
'required' => true,
'unique' => true,
],
'slug' => [
'required' => true,
'unique' => true,
'config' => [
'slugify' => 'name',
],
],
'category' => [
'required' => true,
],
];
Честно говоря, ты рок! )) Вы хотите сказать, что у вас есть конструктор форм, а не рендеринг? Покажи пожалуйста, где ты рендеришь формбилдер. Также почти все экземпляры классов пиротехники поддерживают цепочку методов.
Да, я не использую рендеринг формы, потому что раньше я использую cakephp, и в этом фреймворке конструктор форм не подходит;) В данный момент я использую обычное представление $ this-> и простую HTML-форму с {{form.fields.name. input_name}}.
функция сохранения - это функция в контроллере, я обновляю вопрос, чтобы добавить код из потока;)
Миграция - это неправильно! У вас есть учетная запись gitlab? Пожалуйста, зарегистрируйтесь, если нет, и дайте мне свое имя пользователя.
Окей, создаю аккаунт: @zixxus
Кроме того, где находится ваш код класса AdvertFormBuilder? А как вы создали свой модуль?
В этот момент я добавляю $ entry = $ form-> getFormEntry (); если (! $ entry-> slug) {$ entry-> slug = $ form-> getFormField ('имя') -> значение.'- '. uniqid (); } эти строки кодировать, и это работает, но я не знаю, хорош этот метод или нет;)
В любом случае у вас должен быть класс AdvertFormBuilder.
Ваш метод плохой и пахнет подозрительно! ИМХО
Хорошо, я удаляю код из контроллера и добавляю его в AdvertFormBuilder. В этом файле я перезаписываю функцию saveForm следующим образом: public function saveForm () {$ form = $ this-> getForm (); $ entry = $ this-> getFormEntry (); если (! $ entry-> slug) {$ entry-> slug = $ this-> getFormField ('имя') -> значение.'- '. uniqid (); } parent :: saveForm (); // ЗАДАЧА: изменить автоматически сгенерированную заглушку}
Что ты об этом думаешь?
Я думаю, что это более странно, чем ваш первый метод. Вам следует начать с правильных миграций. Тогда я думаю, что вы делаете неправильные поступки для достижения своей цели. Пожалуйста, проверьте папку core и посмотрите, как это было там сделано.






Миграция модуля:
use Anomaly\Streams\Platform\Database\Migration\Migration;
use Defr\AdvertsModule\Category\CategoryModel;
class DefrModuleAdvertsCreateAdvertsFields extends Migration
{
/**
* The addon fields.
*
* @var array
*/
protected $fields = [
'name' => 'anomaly.field_type.text',
'slug' => [
'type' => 'anomaly.field_type.slug',
'config' => [
'slugify' => 'name',
'type' => '-',
],
],
'category' => [
'type' => 'anomaly.field_type.relationship',
'config' => [
'mode' => 'lookup',
'related' => CategoryModel::class,
],
],
];
}
Перенос потока объявлений:
class DefrModuleAdvertsCreateAdvertsStream extends Migration
{
/**
* The stream definition.
*
* @var array
*/
protected $stream = [
'slug' => 'adverts',
'title_column' => 'name',
'searchable' => true,
'trashable' => true,
];
/**
* The stream assignments.
*
* @var array
*/
protected $assignments = [
'name' => [
'required' => true,
],
'slug' => [
'required' => true,
'unique' => true,
],
'category',
];
}
И миграция потоков категорий:
class DefrModuleAdvertsCreateCategoriesStream extends Migration
{
/**
* The stream definition.
*
* @var array
*/
protected $stream = [
'slug' => 'categories',
'title_column' => 'name',
];
/**
* The stream assignments.
*
* @var array
*/
protected $assignments = [
'name' => [
'required' => true,
],
'slug' => [
'required' => true,
'unique' => true,
],
];
}
Заголовок должен автоматически набираться при вводе имени.
Покажите, пожалуйста, миграцию рекламного потока. А также, что ваш код - это от контроллера? Я имею в виду публичный метод
save. А откуда вторая маленькая часть?