Способ определения входных данных cakephpDefaults на уровне сайта

Есть ли способ определить options['inputDefaults'] на уровне сайта, чем в каждой форме

Ответ 1

TL;DR:

Вставьте 2 куска кода ниже в их соответствующие пятна, затем измените массив $defaultOptions на то, что вы хотите - вуаля. Он не изменяет никаких функций FormHelper, кроме добавления значений по умолчанию в Form->create inputDefaults.

Объяснение и код:

Вы можете расширить FormHelper (проще, чем это звучит), создав свой собственный MyFormHelper:

<?php
//create this file called 'MyFormHelper.php' in your View/Helper folder
App::uses('FormHelper', 'View/Helper');
class MyFormHelper extends FormHelper {

    public function create($model = null, $options = array()) {
        $defaultOptions = array(
            'inputDefaults' => array(
                'div' => false,
                'label' => false
            )
        );      

        if(!empty($options['inputDefaults'])) {
            $options = array_merge($defaultOptions['inputDefaults'], $options['inputDefaults']);
        } else {
            $options = array_merge($defaultOptions, $options);
        }
        return parent::create($model, $options);
    }
}

Затем в вашем AppController включите помощник формы следующим образом (если у вас уже есть переменная $helpers, просто добавьте 'Form' => ... к ней):

public $helpers = array(
    'Form' => array(
        'className' => 'MyForm'
    )
);

Это делает так, что всякий раз, когда вы вызываете $this->Form, он на самом деле вызывает ваш пользовательский "MyFormHelper" - и единственное, что он делает, это установить inputDefaults, если они не указаны, а затем продолжить выполнение нормальной логики найденный в Cake FormHelper.

Ответ 2

Это действительно здорово - я немного изменил это, так что вы используете Hash:: merge, вместо объединения массива, чтобы сохранить его в Cake Api. Кроме того, я назвал свой "AppFormHelper" - но это только мое собственное название: именования помощников довольно свободно. Спасибо за подсказку!

Класс хэша: http://book.cakephp.org/2.0/en/core-utility-libraries/hash.html

<?php
/**
 * @file AppFormHelper.
 *  This allows you to create defaults for your forms.
 */
App::uses('FormHelper', 'View/Helper');

class AppFormHelper extends FormHelper {

  public function create($model = null, $options = array()) {
    $default = array(
      'inputDefaults' => array(
        'div' => false,
        'class' => 'form-control',
        'autocomplete' => 'off',
      ),
    );
    $options = Hash::merge($default, $options);
    return parent::create($model, $options);
  }

}

Ответ 3

Могу ли я добавить, что в коде Dave выше есть ошибка. Строка:

$options = array_merge($defaultOptions['inputDefaults'], $options['inputDefaults']);

Вызывает "Уведомление (8): Массив для преобразования строк [CORE/Cake/View/Helper.php, строка 486]", когда inputDefaults задается как в расширенном FormHelper, так и в самой форме.

Эта ошибка отсутствует в версии kirikintha.