Как правильно настроить дерево с помощью Cakephp3? - PullRequest
0 голосов
/ 01 июля 2019

Я работаю над проектом, которому нужно дерево для структурирования категорий. Проблема в том, что я не могу найти способ объединения таблиц, как это должно быть между моими моделями, или, возможно, это связано с самим контроллером. Когда я заполняю форму и публикую ее, пишется только таблица Категории, в Categorylangs ничего не происходит. Я уверен, что это небольшая ошибка или что-то простое, что я неправильно понял здесь .. спасибо

    public function add()
    {
        $category = $this->Categories->newEntity();
        $category->categorylangs = $this->Categories->Categorylangs->newEntity();

        if ($this->request->is(['patch', 'post', 'put'])) {

            $category = $this->Categories->patchEntity($category, $this->request->getData());

            debug($category);
            die();

            if ($this->Categories->save($category)) {
                $this->Flash->success(__('The category has been saved.'));

                return $this->redirect(['action' => 'index']);
            }
            $this->Flash->error(__('The category could not be saved. Please, try again.'));
        }
        $this->set(compact('category'));

    }



class CategoriesTable extends Table


        $this->setTable('categories');
        $this->setDisplayField('id');
        $this->setPrimaryKey('id');

        $this->addBehavior('Tree');

        $this->hasMany('ChildCategories', [
            'className' => 'Categories',
            'foreignKey' => 'parent_id'
        ]);
        $this->hasMany('Categorylangs', [
            'foreignKey' => 'category_id'
        ]);
        // $this->hasMany('Privatequestions', [
        //     'foreignKey' => 'category_id'
        // ]);
        // $this->hasMany('Publicquestions', [
        //     'foreignKey' => 'category_id'
        // ]);
        // $this->hasMany('Userpros', [
        //     'foreignKey' => 'category_id'
        // ]);
    }

    /**
     * Default validation rules.
     *
     * @param \Cake\Validation\Validator $validator Validator instance.
     * @return \Cake\Validation\Validator
     */
    public function validationDefault(Validator $validator)
    {
        $validator
            ->nonNegativeInteger('id')
            ->allowEmptyString('id', 'create');

        $validator
            ->boolean('active')
            ->requirePresence('active', 'create')
            ->allowEmptyString('active', false);

        return $validator;
    }

    /**
     * Returns a rules checker object that will be used for validating
     * application integrity.
     *
     * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
     * @return \Cake\ORM\RulesChecker
     */
    public function buildRules(RulesChecker $rules)
    {
        return $rules;
    }
}


class CategorylangsTable extends Table
{

    {
        parent::initialize($config);

        $this->setTable('categorylangs');
        $this->setDisplayField('id');
        $this->setPrimaryKey('id');

        $this->belongsTo('Categories', [
            'foreignKey' => 'category_id',
            'joinType' => 'INNER'
        ]);
        $this->belongsTo('Languages', [
            'foreignKey' => 'language_id',
            'joinType' => 'INNER'
        ]);
    }

    /**
     * Default validation rules.
     *
     * @param \Cake\Validation\Validator $validator Validator instance.
     * @return \Cake\Validation\Validator
     */
    public function validationDefault(Validator $validator)
    {
        $validator
            ->nonNegativeInteger('id')
            ->allowEmptyString('id', 'create');

        $validator
            ->scalar('label')
            ->maxLength('label', 350)
            ->requirePresence('label', 'create')
            ->allowEmptyString('label', false);

        $validator
            ->scalar('slug')
            ->maxLength('slug', 450)
            ->requirePresence('slug', 'create')
            ->allowEmptyString('slug', false);

        $validator
            ->scalar('description')
            ->requirePresence('description', 'create')
            ->allowEmptyString('description', false);

        return $validator;
    }

    /**
     * Returns a rules checker object that will be used for validating
     * application integrity.
     *
     * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
     * @return \Cake\ORM\RulesChecker
     */
    public function buildRules(RulesChecker $rules)
    {
        $rules->add($rules->existsIn(['category_id'], 'Categories'));
        $rules->add($rules->existsIn(['language_id'], 'Languages'));

        return $rules;
    }
}


The view with the form to fill the 2 tables:

<nav class="large-3 medium-4 columns" id="actions-sidebar">
    <ul class="side-nav">
        <li class="heading"><?= __('Actions') ?></li>
        <li><?= $this->Html->link(__('List Categories'), ['action' => 'index']) ?></li>
    </ul>
</nav>
<div class="categories form large-9 medium-8 columns content">
    <?= $this->Form->create($category) ?>
    <fieldset>
        <legend><?= __('Add Category') ?></legend>
        <?php
            echo $this->Form->control('parent_id', ['options' => $parentCategories, 'empty' => __('root')]);
            echo $this->Form->control('categorylangs.label');
            echo $this->Form->control('categorylangs.description');
            echo $this->Form->control('categorylangs.language_id');
            echo $this->Form->control('active');
        ?>
    </fieldset>
    <?= $this->Form->button(__('Submit')) ?>
    <?= $this->Form->end() ?>
</div>

Вот отладка из Categoriescontroller.php, показывающая, что данные не передаются так, как они должны быть, но я не могу понять, как это исправить ...

/ src / Controller / Admin / CategoriesController.php (строка 60) объект (приложение \ модель \ объект \ категория) {

'categorylangs' => [],
'active' => false,
'[new]' => true,
'[accessible]' => [
    'parent_id' => true,
    'lft' => true,
    'rght' => true,
    'active' => true,
    'parent_category' => true,
    'child_categories' => true,
    'categorylangs' => true,
    'privatequestions' => true,
    'publicquestions' => true,
    'userpros' => true
],
'[dirty]' => [
    'categorylangs' => true,
    'active' => true
],
'[original]' => [
    'categorylangs' => object(App\Model\Entity\Categorylang) {

        '[new]' => true,
        '[accessible]' => [
            'label' => true,
            'slug' => true,
            'description' => true,
            'category_id' => true,
            'language_id' => true,
            'category' => true,
            'language' => true
        ],
        '[dirty]' => [],
        '[original]' => [],
        '[virtual]' => [],
        '[hasErrors]' => false,
        '[errors]' => [],
        '[invalid]' => [],
        '[repository]' => 'Categorylangs'

    }
],
'[virtual]' => [],
'[hasErrors]' => false,
'[errors]' => [],
'[invalid]' => [],
'[repository]' => 'Categories'

}

1 Ответ

1 голос
/ 01 июля 2019

Categorylangs - это отношение hasMany, а не hasOne, поэтому имена ваших полей должны быть такими, как categorylangs.0.label, а не categorylangs.label.Вам нужно, чтобы он генерировал массив сущностей, даже если в нем есть только одна сущность.

И $category->categorylangs = $this->Categories->Categorylangs->newEntity(); здесь не имеет смысла, значение categorylangs будет перезаписано patchEntity Звоните.

...