как сопоставить поле ввода, прежде чем сохранить его в cakephp - PullRequest
0 голосов
/ 23 марта 2012

когда пользователь вводит полный URL-адрес. Я хочу сохранить только идентификатор YouTube ... Предварительный анализ и извлечение идентификатора видео, а затем он будет сохранен в базе данных. Проблема заключается в том, как выполнить предварительную проверку и извлечь идентификатор YouTube перед сохранением полного URL спасибо за помощь

// это функция add () в videos_controller

 function add() {
        if (!empty($this->data)) {

            $this->Video->create();

            if ($this->Video->save($this->data)) {
                $this->Session->setFlash(__('The Video has been saved', true));
                $this->redirect(array('action' => 'admin_index'));
            } else {
                $this->Session->setFlash(__('The Video could not be saved. Please, try again.', true));
            }
        }
        $vcats = $this->Video->Vcat->find('list');
        $this->set(compact('vcats'));
    }

// это файл add.ctp

<div class="videos form">
    <?php // echo $this->Form->create('Image');?>
    <?php echo $form->create('Video'); ?>
    <fieldset>
        <legend><?php __('Add Video'); ?></legend>
        <?php
        echo $this->Form->input('vcat_id');
        echo $this->Form->input('title');
       $url= $this->Form->input('link');
      echo $url
        ?>
    </fieldset>
    <?php echo $this->Form->end(__('Submit', true)); ?>
</div>
<div class="actions">
    <h3><?php __('Actions'); ?></h3>
    <ul>

        <li><?php echo $this->Html->link(__('List Videos', true), array('action' => 'index')); ?></li>
        <li><?php echo $this->Html->link(__('List Vcats', true), array('controller' => 'vcats', 'action' => 'index')); ?> </li>
        <li><?php echo $this->Html->link(__('New Vcat', true), array('controller' => 'vcats', 'action' => 'add')); ?> </li>
    </ul>
</div>

// мы получаем уникальный идентификатор видео из URL, сопоставляя шаблон, но куда я помещаю этот код для соответствия перед сохранением

preg_match("/v=([^&]+)/i", $url, $matches);
$id = $matches[1];

Ответы [ 2 ]

1 голос
/ 23 марта 2012

Здесь

 function add() {
    if (!empty($this->data)) {

        $this->Video->create();
        $url = $this->data['Video']['link'];

        /*assuming you have a column `id` in your `videos` table
        where you want to store the id,
        replace this if you have different column for this*/

        preg_match("/v=([^&]+)/i", $url, $matches);
        $this->data['Video']['id'] = $matches[1];

        //rest of the code
    }
 }
0 голосов
/ 23 марта 2012

Я думаю, лучшее место для этого - метод beforeSave или beforeValidate модели:

class Video extends AppModel {

    ...

    public function beforeSave() {
      if (!empty($this->data[$this->alias]['link'])) {
        if (preg_match("/v=([^&]+)/i", $this->data[$this->alias]['link'], $matches)) {
          $this->data[$this->alias]['some_id_field'] = $matches[1];
        }
      }
      return true;
    }

    ...

}
...