Ищу функцию на подобе path_save(), только мне нужно обновление существующего алиаса.
Есть ли функция для обновления алиаса?
Главные вкладки
Лучший ответ
Плохо понятно, что Вы хотите добиться в итоге, возможно из-за недостатка информации..
Я просто хотел обратить внимание, что для обновления существующего алиаса, в массиве данных алиаса, передаваемом в функцию path_save должен присутствовать элемент с ключем 'pid' и значением = идентификатор алиаса в БД .
Тогда обновиться существующий алиас с данным pid, и не будет создаваться новый.
Комментарии
Что значит обновление? А path_save разве не обновление?
Обновление значит, что уже существует алиас, но по определенным условиям нужно обновить алиас (изменить сам алиас).
Пример.
Была нода с алиасом site.ru/example_1
После того как были внесены некоторые изменения в ноду нужно сменить алиас на: site.ru/exapmple_2
Насколько я понимаю path_save() сохраняет только и если я её использую то будет просто дубликат пути. Можно конечно использовать path_delete(), но это всеровно будет не обновление алиаса, а создание нового.
Наверное если я задал вопрос, значит что-то пробовал. Да, я пробовал. И у меня получалась ситуация когда алиас дублировался и у меня очень много дублей получилось с одним и тем же идентификатором ноды. Собственно по этому возник вопрос.
Вот пример такого кода:
<?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 (и алиас к ним). И таких алиасов может быть много.Более того, пользователь может изменить ноду так, что нужно будет удалить несколько алиасов, а несколько изменить.
Плохо понятно, что Вы хотите добиться в итоге, возможно из-за недостатка информации..
Я просто хотел обратить внимание, что для обновления существующего алиаса, в массиве данных алиаса, передаваемом в функцию path_save должен присутствовать элемент с ключем 'pid' и значением = идентификатор алиаса в БД .
Тогда обновиться существующий алиас с данным pid, и не будет создаваться новый.
В том то и проблема. Давайте я вам постараюсь объяснить.
Я делаю электронную библиотеку с файлами .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 делать обновление.
Мне нужно подумать
<?php
// Загружаем из БД данные алиаса по реальному пути (node/222)
$path=path_load('node/222');
// Меняем алиас
$path['alias']='new-alias';
// Сохраняем алиас в БД,
// $path содержит элемент с ключом 'pid' - идентификатор алиаса в БД
// Поэтому следующая строка обновит в БД алиас с данным идентификатором, а не создаст новый.
path_save($path);
?>
@Orion76
Да и path_save выше крыши. Не видите что ли - всего один параметр у него, неспроста же.
В большинсте случаев(и path_save тоже), для записи данных в таблицу используется функция drupal_write_record($table, $record, $primary_keys)
Пожалуйста.. обратите внимание на ее третий параметр..
Я понимаю, иногда бывают моменты когда вся жисть х..ня и бабы леди и солнце гребанный фонарь..
Но это не повод цепляться к человекам..
хамить изволите? В код то смотрели?
<?php drupal_write_record('url_alias', $path, array('pid'));?>
Это видели?
Спасибо за совет, буду пробовать. Но уже вижу что решение не подходит, см. выше
Видел, прокомментируйте пожалуйста, зачем там третьим аргументом - array('pid')
<?php if (!$path = path_load($current_path)) {
?>
path_load в аргументах принимает реальный путь (если параметр - строка), а не алиас, поэтому эта секция у Вас никогда не отрабатывает.
Чтобы офункция искала именно по алиасу, вместо $current_path, надо передавfть массив: array('alias'=>$current_path)