формирует строку concat, конвертирующую ноль в unset в cakephp - PullRequest
0 голосов
/ 18 июня 2010

Это меня победило. Я пытаюсь создать массив полей в cakePHP 1.2.5 и PHP 5.3.2 Массив основан на нуле. На первой итерации $ count == 0. По какой-то причине конкатенация строк, по-видимому, преобразует это в ноль или не устанавливает, какой торт затем интерпретируется как «вставить имя модели здесь», а именно:

for($count=0;$count<$num;$count++)
{
   echo $form->input($count.'.NodeDescriptor.title');
}

<input name="data[NodeDescriptor][NodeDescriptor][title]" type="text" id="NodeDescriptorNodeDescriptorTitle" />
<input name="data[1][NodeDescriptor][title]" type="text" id="1NodeDescriptorTitle" /></div><tr><td><div class="input select">
...

Я пытался привести значение, strval'ing его, одинарные кавычки, двойные кавычки, двойные кавычки и {} безрезультатно. Это особенность PHP, непослушность CakePHP или я глупый?

Ответы [ 3 ]

1 голос
/ 18 июня 2010

Во-первых, существует соглашение, что если вы сохраняете поля, сопоставленные с одной и той же моделью и хотите несколько вставок в дб, массив данных должен быть отформатирован, как указано Майком выше:

т.е. Модель. {П} .field

Вы можете ясно видеть, что они явно говорят, что когда вы сохраняете одно и то же имя поля в одной и той же модели несколько раз, это является соглашением , поскольку заголовок раздела руководства название "Соглашения об именах полей"

http://book.cakephp.org/view/1390/Automagic-Form-Elements#Field-naming-convention-1391

Вы не можете действительно назвать проблему ввода ошибкой CakePHP, если метод ввода не был написан, чтобы приспособить вас к использованию этого метода непреднамеренным образом. Метод явно разбивает переданную строку на "." символ и предполагает, что если вы используете строку с "." символ, который вы собираетесь отформатировать для сохранения массива данных, используя Model-> save или Model-> saveAll

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

т.е. [0] [0] [Дескриптор] [заголовок], 1 [Дескриптор] [заголовок]

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

т.е. [Дескриптор] [0] [заголовок], Дескриптор [заголовок]

Итак, если вы хотите использовать помощников, вы должны использовать их так, как они предназначены для работы. Это не ошибка, если вы придумали свой собственный крайний случай, который изначально не должен был поддерживаться помощником.

Судя по вашему примеру - нет никаких причин не использовать saveAll в любом случае. Есть ли у вас какая-то причина, чтобы этого избежать; Кажется, это правильный способ сделать то, что вы просите.

** ИЗМЕНЕНО В ФИКС. БИЛЕТ http://cakephp.lighthouseapp.com/projects/42648/tickets/867 **

App это как app / views / app_view.php

<?php

App::import('View', 'View', false);

class AppView extends View {

    /**
     * Constructor
     *
     * @param object $controller
     */
    function __construct(&$controller){
            parent::__construct($controller);
    }

    /**
     * Temporary View::entity fix for 1.2.5
     * Returns the entity reference of the current context as an array of identity parts
     *
     * @return array An array containing the identity elements of an entity
     * @access public
     */
    function entity() {
        $assoc = ($this->association) ? $this->association : $this->model;
        if (!empty($this->entityPath)) {
            $path = explode('.', $this->entityPath);
            $count = count($path);
            if (
                ($count == 1 && !empty($this->association)) ||
                ($count == 1 && $this->model != $this->entityPath) ||
                ($count == 2 && !empty($this->fieldSuffix)) ||
                is_numeric($path[0]) && !empty($assoc)
            ) {
                array_unshift($path, $assoc);
            }
            return Set::filter($path);
        }
        return array_values(Set::filter(
            array($assoc, $this->modelId, $this->field, $this->fieldSuffix)
        ));
    }
}
?>

Сообщите контроллеру использовать представление с его общедоступным свойством $ view.

<?php
    class FooController extends Controller {
        ...
        ...
        var $view = 'App';
        ...
        ...
    }
?>
1 голос
/ 23 июня 2010

Я перебазировал массив на 1, и он работает нормально и как ожидалось.

0 голосов
/ 18 июня 2010

Можете ли вы придерживаться соглашений CakePHP и поставить сначала имя модели, а затем индекс?

echo $form->input('NodeDescriptor.'.$count.'.title');
...