Вход CakePHP имеет неправильный тип ввода. Должен быть текстовым полем, но выпадающим: S - PullRequest
0 голосов
/ 24 августа 2010

Я добавил функциональность тегов cakePHP в мои приложения.У меня есть таблица проектов, которая может иметь много связанных тегов.Итак, у меня есть таблица тегов с идентификатором и поле тега varchar.Таблица проектов с полем тегов varchar и таблица ссылок projects_tags с полями id, tag_id и project_id.Когда я добавляю теги, входящие в мое представление, существующие теги по какой-то причине заполняются в раскрывающемся списке.Может кто-нибудь выяснить, что я здесь сделал неправильно?

Вот моя модель тегов:

<?php
class ProjectTag extends AppModel {
var $name = 'ProjectTag';


var $hasAndBelongsToMany = array('Tag' => 
                           array('className'    => 'Tag', 
                                 'joinTable'    => 'tags', 
                                 'foreignKey'   => 'tag_id', 
                                 'conditions'   => '', 
                                 'order'        => '', 
                                 'limit'        => '', 
                                 'unique'       => true, 
                                 'finderQuery'  => '', 
                                 'deleteQuery'  => '', 
                           ),
                           array('className'    => 'Project', 
                                 'joinTable'    => 'projects', 
                                 'foreignKey'   => 'project_id', 
                                 'conditions'   => '', 
                                 'order'        => '', 
                                 'limit'        => '', 
                                 'unique'       => true, 
                                 'finderQuery'  => '', 
                                 'deleteQuery'  => '', 
                           )

                           );

}

?>

Вот мой вид проекта добавления add.ctp:

<?php
echo $form->create('Project');
echo $form->input('title', array('label' => 'Title'));
echo $form->input('website', array('label' => 'Website'));
echo $form->input('description', array('label' => 'Description'));
echo $form->input('language_id', array('label' => 'Language'));
echo $form->input('tags');
echo $form->end('Post project');
?>

Вот модель поведения тега:

<?php

class TagBehavior extends ModelBehavior {
/**
 * Initiate behaviour for the model using specified settings.
 *
 * @param object $model    Model using the behaviour
 * @param array $settings    Settings to override for model.
 *
 * @access public
 */
function setup(&$model, $settings = array()) {


    $default = array( 'table_label' => 'tags', 'tag_label' => 'tag', 'separator' => ',');

    if (!isset($this->settings[$model->name])) {
        $this->settings[$model->name] = $default;
    }

$this->settings[$model->name] = array_merge($this->settings[$model->name], ife(is_array($settings), $settings, array()));

}

/**
 * Run before a model is saved, used to set up tag for model.
 *
 * @param object $model    Model about to be saved.
 *
 * @access public
 * @since 1.0
 */
function beforeSave(&$model) {
// Define the new tag model
$Tag =& new Tag;
    if ($model->hasField($this->settings[$model->name]['table_label']) 
    && $Tag->hasField($this->settings[$model->name]['tag_label'])) {


    // Parse out all of the 
    $tag_list = $this->_parseTag($model->data[$model->name][$this->settings[$model->name]['table_label']], $this->settings[$model->name]);
    $tag_info = array(); // New tag array to store tag id and names from db
    foreach($tag_list as $t) {
        if ($res = $Tag->find($this->settings[$model->name]['tag_label'] . " LIKE '" . $t . "'")) {
            $tag_info[] = $res['Tag']['id'];
        } else {
            $Tag->save(array('id'=>'',$this->settings[$model->name]['tag_label']=>$t));
            $tag_info[] = sprintf($Tag->getLastInsertID());
        }
        unset($res);
    }

    // This prepares the linking table data...
    $model->data['Tag']['Tag'] = $tag_info;
    // This formats the tags field before save...
    $model->data[$model->name][$this->settings[$model->name]['table_label']] = implode(', ', $tag_list);
}
return true;
}


/**
 * Parse the tag string and return a properly formatted array
 *
 * @param string $string    String.
 * @param array $settings    Settings to use (looks for 'separator' and 'length')
 *
 * @return string    Tag for given string.
 *
 * @access private
 */
function _parseTag($string, $settings) {
    $string = strtolower($string);

    $string = preg_replace('/[^a-z0-9' . $settings['separator'] . ' ]/i', '', $string);
    $string = preg_replace('/' . $settings['separator'] . '[' . $settings['separator'] . ']*/', $settings['separator'], $string);

$string_array = preg_split('/' . $settings['separator'] . '/', $string);
$return_array = array();

foreach($string_array as $t) {
    $t = ucwords(trim($t));
    if (strlen($t)>0) {
        $return_array[] = $t;
    }
}

    return $return_array;
}
}

?>

Вот мое добавление контроллера проекта:

function add() {


    $this->set("Languages", $this->Project->Language->find("list"));


    if (!empty($this->data)) {
        if ($this->Project->save($this->data)) {
            $this->Session->setFlash('Project added.');
            $this->redirect(array('action' => 'index'));
        }
    }
}

Ответы [ 2 ]

1 голос
/ 24 августа 2010

cdburgess прав в отношении причины появления раскрывающегося списка, но вы можете изменить это разумное значение по умолчанию для удовлетворения ваших собственных потребностей, настроив поле "magic" для Cake:

echo $form->input('tags', array( 'type' => 'text' ) );

Я не буду клястьсясинтаксис, но это создаст входные теги в виде текстового поля.

ИМО, это гораздо лучший вариант, чем отбрасывать ассоциацию, которая обладает такой мощью в других местах.

1 голос
/ 24 августа 2010

Это из-за отношений в модели.CakePHP автоматически свяжет теги и создаст для вас выпадающий список.Это цель наличия связанного поля.В основном говорится: «Этот тег должен быть тем, что существует в этой таблице« тегов »».Поэтому он предварительно заполняет его данными из тегов.

Удалите связь HABTM, и он вернется к тестовой ячейке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...