получить уникальный слаг в codeigniter

Я хочу получить уникальный слаг для своих статей. Я использую кодигнитер. Мне было интересно иметь что-то вроде sample-title-1 и sample-title-2, если есть две статьи с одинаковым заголовком, как это делает codeignier с загрузкой файла filename(:num). Я не мог понять, как это сделать. Я не эксперт по codeigniter. Я изучаю это.

Я подготовил функцию, когда передается строка $str, она проверяет, существует ли слаг, если да, то добавляет ID этой статьи в конец этого слага и возвращает его, если нет, возвращает слаг.

Он отлично работает и служит уникальной цели. Но я хотел, чтобы было что-то вроде sample-title-1 и sample-title-2 . Есть ли способ сделать это?

$data['slug'] = $this->get_slug($data['title']);


public function get_slug ($str)
    {
        $slug = url_title($str, 'dash', true);
        // Do NOT validate if slug already exists
        // UNLESS it's the slug for the current page

        $id = $this->uri->segment(4);
        $this->db->where('slug', $slug);
        ! $id || $this->db->where('id !=', $id);
        $category = $this->category_m->get();

        if (count($category)) {
            return $slug.$id;
        }

        return $slug;
    }

person prakashchhetri    schedule 30.07.2013    source источник
comment
возможный дубликат Использование слагов в codeigniter   -  person alpere    schedule 14.12.2013


Ответы (3)


простой в использовании и действительно полезный для создания уникальных слагов. Посмотрите библиотеку слагов CI

прочитайте его документацию, чтобы реализовать его.

person umefarooq    schedule 30.07.2013

то, что я делал, это делать slug db field UNIQUE.

Затем легко сделать все с помощью помощников CI Url Helper и Помощник по работе с текстом

    $last_id_inserted = //get from db the last post's ID;
    $post_title = "My slug would be";
    $slug =  mb_strtolower(url_title(convert_accented_characters($post_title))).'-'.$last_id_inserted;
    echo $slug;
    //outputting my-slug-would-be-123



//insert the new post with slug

Таким образом, идентификатор будет уникальным и кратким.

person itsme    schedule 31.07.2013

Я думаю, вам нужно что-то вроде этого:

//Database loaded
//Text helper loaded

function post_uniq_slug($slug, $separator='-', $increment_number_at_end=FALSE) {    
    //check if the last char is a number
    //that could break this script if we don't handle it
    $last_char_is_number = is_numeric($slug[strlen($slug)-1]);
    //add a point to this slug if needed to prevent number collision..
    $slug = $slug. ($last_char_is_number && $increment_number_at_end? '.':'');

    //if slug exists already, increment it
    $i=0;
    $limit = 20; //for security reason
    while( get_instance()->db->where('slug', $slug)->count_all_results('posts') != 0) {
        //increment the slug
        $slug = increment_string($slug, $separator);

        if($i > $limit) {
            //break;
            return FALSE;
        }

        $i++;
    }

    //so now we have unique slug
    //remove the dot create because number collision
    if($last_char_is_number && $increment_number_at_end) $slug = str_replace('.','', $slug);

    return $slug;
}

Примеры:

post_uniq_slug('sample'); //"sample" exists
//sample-1

post_uniq_slug('sample-2013'); //"sample-2013" exists
//sample-2013-2

post_uniq_slug('sample-2013', '-', TRUE); //increment "sample-2013"
//sample-2014

*НЕ ИСПЫТАНО

person Aurel    schedule 31.07.2013