Есть ли функция для обновления алиаса?

Главные вкладки

Лучший ответ

Аватар пользователя Orion76 Orion76 27 декабря 2015 в 10:11

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

Я просто хотел обратить внимание, что для обновления существующего алиаса, в массиве данных алиаса, передаваемом в функцию path_save должен присутствовать элемент с ключем 'pid' и значением = идентификатор алиаса в БД .
Тогда обновиться существующий алиас с данным pid, и не будет создаваться новый.

Комментарии

Аватар пользователя animan animan 25 декабря 2015 в 1:10

Обновление значит, что уже существует алиас, но по определенным условиям нужно обновить алиас (изменить сам алиас).

Пример.
Была нода с алиасом site.ru/example_1

После того как были внесены некоторые изменения в ноду нужно сменить алиас на: site.ru/exapmple_2

Насколько я понимаю path_save() сохраняет только и если я её использую то будет просто дубликат пути. Можно конечно использовать path_delete(), но это всеровно будет не обновление алиаса, а создание нового.

Аватар пользователя xakudu xakudu 25 декабря 2015 в 11:39

Maximus_fonar wrote:
Насколько я понимаю path_save() сохраняет только и если я её использую то будет просто дубликат пути.
С чего вы это взяли? Вы хоть код смотрели или пробовали работать с функцией?

Аватар пользователя animan animan 27 декабря 2015 в 1:41

xakudu wrote:

Maximus_fonar написал:

Насколько я понимаю path_save() сохраняет только и если я её использую то будет просто дубликат пути.

С чего вы это взяли? Вы хоть код смотрели или пробовали работать с функцией?


Наверное если я задал вопрос, значит что-то пробовал. Да, я пробовал. И у меня получалась ситуация когда алиас дублировался и у меня очень много дублей получилось с одним и тем же идентификатором ноды. Собственно по этому возник вопрос.

Вот пример такого кода:

<?php    
if (!$path path_load($current_path)) {
    
$path = array(
        
'source' => $current_path,
        
'alias' => $full_section_path,
        );
    
path_save($path);
    
$current_path $full_section_path;
} else {
    
$current_path $full_section_path;
}
?>

В результате чего мне пришлось сделать проверку на существующий алиас, по другому никак. Если у Вас есть совет для меня то говорите.

ПС. Понимаете у мене еще специфика такая (у меня в нода имеет не 1 страницу, а много), что алиас генерируется даже когда пользователь заходит на саму ноду (node/10), то у меня создаются урл node/10/1/1 (и алиас к ним). И таких алиасов может быть много.

Более того, пользователь может изменить ноду так, что нужно будет удалить несколько алиасов, а несколько изменить.

Аватар пользователя Orion76 Orion76 27 декабря 2015 в 10:11

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

Я просто хотел обратить внимание, что для обновления существующего алиаса, в массиве данных алиаса, передаваемом в функцию path_save должен присутствовать элемент с ключем 'pid' и значением = идентификатор алиаса в БД .
Тогда обновиться существующий алиас с данным pid, и не будет создаваться новый.

Аватар пользователя animan animan 27 декабря 2015 в 20:29

В том то и проблема. Давайте я вам постараюсь объяснить.

Я делаю электронную библиотеку с файлами .fb2, по сути xml.

Действия перед созданием ноды:
1. Пользователь заполняет поля и загружает файл .fb2.
2. Поле того как пользователь сохраняет материал, я через SimpleXMLElement читаю все разделы книги и делаю для них страницы. К примеру:

category/book-10 - основная страница ноды (она же node/10) - этот алиас создается средствами drupal
category/book-10/chapter-1 - Раздел 1 (node/10/1) - все разделы генерируются кодом выше (код будет исполниться для каждого раздела до тех пор пока не добавятся все алиасы)
category/book-10/chapter-2 - Раздел 2 (node/10/2)
category/book-10/chapter-3 - Раздел 3 (node/10/3)

Всё работает нормально, но бывает ситуации когда книгу нужно обновить, а там структура немного другая и собственно алиасы должны быть другие. А так как модуль уже их сохранил, получается что в настройках path старые не рабочие алиасы.

Теперь объяснение по коду:

<?php
/**
 * $current_path  = arg(0) . '/' . arg(1) . "/{$section}; 1 аргумент - node, 2 - nid, 
 * $section - идентификатор раздела
 * $full_section_path  = implode('/', array($node_path['alias'], $section_path));  $node_path['alias'] - алиас ноды (category/book-10), 
 * $section_path - это название раздела (например, chapter-1)
 */
if (!$path path_load($current_path)) {  //Сдесь просто я делаю проверку, 
//если алиас есть то не выполняем функцию path_save()
    
$path = array(
        
'source' => $current_path,
        
'alias' => $full_section_path,
        );
    
path_save($path);
    
$current_path $full_section_path;
} else {
    
$current_path $full_section_path;
}
?>

ПС. Получается что б обновить алиас мне попросту нужно использовать $path['pid']?
И например использовать switch, что при условии если путь node/10/1 существует но не совпадает алиас с $full_section_path делать обновление.

Мне нужно подумать Smile

Аватар пользователя Orion76 Orion76 25 декабря 2015 в 1:24
<?php
// Загружаем из БД данные алиаса по реальному пути (node/222)
$path=path_load('node/222');
// Меняем алиас
$path['alias']='new-alias';
// Сохраняем алиас в БД, 
// $path содержит элемент с ключом 'pid' - идентификатор алиаса в БД
// Поэтому следующая строка обновит в БД алиас с данным идентификатором, а не создаст новый.
path_save($path);
?>
Аватар пользователя Orion76 Orion76 26 декабря 2015 в 4:23

В большинсте случаев(и path_save тоже), для записи данных в таблицу используется функция drupal_write_record($table, $record, $primary_keys)

xakudu wrote:

Пожалуйста.. обратите внимание на ее третий параметр..

Я понимаю, иногда бывают моменты когда вся жисть х..ня и бабы леди и солнце гребанный фонарь..
Но это не повод цепляться к человекам..

Аватар пользователя Orion76 Orion76 27 декабря 2015 в 20:52
<?php

if (!$path path_load($current_path)) {
?>

path_load в аргументах принимает реальный путь (если параметр - строка), а не алиас, поэтому эта секция у Вас никогда не отрабатывает.

Чтобы офункция искала именно по алиасу, вместо $current_path, надо передавfть массив: array('alias'=>$current_path)