Метод просмотра CakePHP с использованием заголовка записи в качестве URL - PullRequest
0 голосов
/ 12 июня 2011

У меня есть следующая структура ссылок для моего портфолио:

<?php echo $this->Html->link($post['Portfolio']['title'], array('controller' => 'portfolio', 'action' => 'view', Inflector::slug($post['Portfolio']['title'])), array('title' => $post['Portfolio']['title'])); ?>

Что дает URL-адреса, такие как: http://driz.co.uk/portfolio/view/Paperview_Magazine

Однако как мне заставить мой контроллер показывать элемент на основе заголовка?

Пока у меня есть это, но я не смог заставить его работать и просто получить пустую страницу (поэтому я также должен проверить, правильный ли формат и является ли он соответствующим элементом)

function view ( $title )
{

    $posts = $this->Portfolio->find('first', array('conditions' => array('Portfolio.title' => $title)
    ));

    if (empty($title))
    {
        $this->cakeError('error404');
    }
    $this->set(compact('posts'));
}

1 Ответ

1 голос
/ 12 июня 2011

@ Росс предложил вам выполнить поиск с использованием Portfolio.slug, так что вот как вы могли бы сделать это:

  1. Добавьте в таблицу базы данных поле с именем slug.Скорее всего, вам понадобится VARCHAR достаточной длины для размещения слаг.
  2. Когда вы создаете или обновляете запись «Портфолио», используйте метод Inflector :: slug, чтобы сгенерировать слаг и сохранить его в своей базе данных.,Вы всегда можете сделать это в событии beforeSave модели или, если хотите, в контроллере перед сохранением данных.
  3. Обновите вызов поиска, чтобы искать Portfolio.slug вместо Portfolio.title.

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

Вот как можно использовать событие beforeSave в вашей модели:

public function beforeSave(array $options = array())
{
  // If the title is not empty, create/update the slug.
  if ( ! empty($this->data[$this->alias]['title'] )
    $this->data[$this->alias]['slug'] = Inflector::slug($this->data[$this->alias]['title']);

  // Returning true is important otherwise the save or saveAll call will fail.
  return true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...