Nano Hash - криптовалюты, майнинг, программирование

Cakephp 3.0.8: массив внутри поля имени исчезает после patchEntity

Я тестирую cakephp 3.0.8, и у меня возникла проблема. Я пытаюсь добавить новые ингредиенты на нескольких языках одновременно, и для этого мне нужно, чтобы в моей форме был массив внутри поля «имя» и «слаг», содержащий язык и значение на этом языке для таблицы i18n. в базе данных. Но после patchEntity перед сохранением массив исчезает и я не понимаю почему.

Что я хочу:

[
    'name' => [
        'en_US' => 'Title',
        'fr_CA' => 'Titre'
    ],
    'slug' => [
        'en_US' => 'Slug',
        'fr_CA' => 'Slug Fr'
    ],
    'season' => ''
]

Что у меня после patchEntity:

[
    'name' => '',
    'slug' => '',
    'season' => ''
]

В моем IngredientController.php

public function add()
{
    $ingredient = $this->Ingredients->newEntity();
    if ($this->request->is('post')) {
        debug($this->request->data);
        $ingredient = $this->Ingredients->patchEntity($ingredient, $this->request->data);
        $ingredient->locale = Configure::read('Config.locales');
        debug($ingredient);die();
        if ($this->Ingredients->save($ingredient)) {
            $this->Flash->success(__('The ingredient has been saved.'));
            return $this->redirect(['action' => 'index']);
        } else {
            $this->Flash->error(__('The ingredient could not be saved. Please, try again.'));
        }
    }

    $this->set(compact('ingredient', 'recipes'));
    $this->set('_serialize', ['ingredient']);
}

В моем объекте Ingredient.php

protected $_accessible = [
    'name' => true,
    'slug' => true,
    'season' => true,
    'recipe_count' => false,
    'recipes' => false,
    '*' => false
];

В моем IngredientsTable.php

public function validationDefault(Validator $validator)
{       
    $validator
        ->requirePresence('name', 'create')
        ->notEmpty('name');

    $validator
        ->allowEmpty('slug');

    $validator
        ->allowEmpty('season');

    return $validator;
}

И, наконец, в моем представлении add.ctp

<div class="ingredients form large-10 medium-9 columns">
<?= $this->Form->create($ingredient) ?>
<fieldset>
    <legend><?= __('Add Ingredient') ?></legend>
    <?php
        foreach ($locales as $lang) {
            echo $this->Form->input('name.'.$lang, ['label' => 'Title ('.$lang.')']);
            echo $this->Form->input('slug.'.$lang, ['label' => 'Slug ('.$lang.')']);
        }
        echo $this->Form->input('season');
    ?>
</fieldset>
<?= $this->Form->button(__('Submit')) ?>
<?= $this->Form->end() ?>

CakePHP generated all the code with the console except for the add.ctp that I modified a bit to have an array inside the "name" and "slug" fields. The var $locales only contain an array of the locales (en_US and fr_CA)

Благодарю вас!


Ответы:


1

В процессе сортировки данные преобразуются на основе типа столбца, и ваши столбцы, скорее всего, являются строковыми типами, поэтому вы не можете вставлять в них массивы, это приведет к пустым строкам.

Посмотри на

А пока используйте метод traits translation(), как показано в документации. Вы можете сделать это в процессе сохранения до или после исправления вашей сущности. Рекомендуется не использовать фактические имена столбцов в своей форме, чтобы вы могли легко исправить данные запроса.

Обратите внимание, что исходный объект должен содержать содержимое языка по умолчанию. Поэтому, если по умолчанию установлено значение en_US, вам следует сохранить только fr_CA в качестве перевода.

И для проверки переведенных полей вам, вероятно, следует использовать собственный класс таблицы перевода и используйте правила применения!

11.07.2015
  • Не могли бы вы привести пример, как проверить переведенное поле? Мне трудно, так как переведенное поле также использует те же правила проверки для поля имени. Я не могу понять, как сделать язык по умолчанию обязательным, а переведенное поле необязательным. 24.07.2015
  • @Mart708 Mart708 В последнем предложении следовало сказать вероятно, так как я не уверен, как это лучше всего сделать, так как я еще не пробовал. Я могу взглянуть на это позже и посмотреть, смогу ли я придумать пример. 24.07.2015
  • У меня была та же проблема, и это было связано с использованием одного и того же имени для столбца базы данных и идентификатора ввода. Спасибо 17.06.2016

  • 2

    Вот мой код, и он работает отлично!

    С моей точки зрения:

    <div class="ingredients form large-10 medium-9 columns">
    <?= $this->Form->create($ingredient) ?>
    <fieldset>
        <legend><?= __('Add Ingredient') ?></legend>
        <?php
            echo $this->Form->input('name', ['label' => __('Title')]);
            foreach ($locales as $lang) {
                echo $this->Form->input('locales.'.$lang.'.name', ['label' => __('Title')]);
            }
            echo $this->Form->input('slug');
            echo $this->Form->input('season');
        ?>
    </fieldset>
    <?= $this->Form->button(__('Submit')) ?>
    <?= $this->Form->end() ?>
    

    I added this piece of code right before the save in my Controller:

    foreach ($this->request->data['locales'] as $lang => $data) {
        $ingredient->translation($lang)->set($data, ['guard' => false]);
    }
    

    Вы должны добавить способ определить, являются ли локали в запросе действительными и поддерживаемыми.

    20.07.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..


    © 2024 nano-hash.ru, Nano Hash - криптовалюты, майнинг, программирование