Запретить Pathauto изменять alias во время node_save()

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

Аватар пользователя luciuz VII luciuz VII 23 апреля 2012 в 1:16

Никак не понимаю как это сделать.
В качестве токена стоит [random:hash:haval128,5]

Вроде перед node_save нужно написать

$node->path['pathauto'] = FALSE;

Да, после этого адрес не меняется, однако вылезает нотис
Notice: Undefined index: alias в функции path_node_update() (строка 204 в файле #####/modules/path/path.module).

%|

Комментарии

Аватар пользователя Semantics Semantics 23 апреля 2012 в 2:22

Может наведёт на мысли, так было в шестёрке:

<?php
// $Id$

/**
 * @file
 * TODO: Enter file description here.
 */

function extra_path_perm(){
        return array('Administer Extra Path', 'Block alias');
}
 
/**
 * Implementation of hook_menu().
 */

function extra_path_menu() {
        $items['admin/build/path/extra-path'] = array(
                'title' => 'Block alias settings',
                'page callback' => 'drupal_get_form',
                'page arguments' => array('extra_path_settings_page'),
                'access arguments' => array('Administer Extra Path'),
                'type' => MENU_LOCAL_TASK,
        );
       
        return $items;
}

/**
 * Implementation of hook_nodeapi().
 */

function extra_path_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
        switch ($op) {
                case 'presave':
                        if((($node->status == 1) || ($node->block_alias == TRUE)) && extra_path_type_status_get($node->type)){
                                db_query('INSERT INTO {extra_path_blocked} (nid) VALUES (%d)', $node->nid);
                       
                                $node->block_alias = TRUE;
                        }
       
                        if($node->block_alias == TRUE){
                                $node->pathauto_perform_alias = FALSE;
                        }
                break;
               
                case 'delete':
                        db_query('DELETE FROM {extra_path_blocked} WHERE nid = %d', $node->nid);
                break;
        }
}

/**
 * Implementation of hook_form_alter().
 */

function extra_path_form_alter(&$form, &$form_state, $form_id) {
  if (isset($form['type']) && isset($form['#node']) && $form['type']['#value'] .'_node_form' == $form_id && (user_access('Block alias') && extra_path_type_status_get($form['#node']->type))) {
    $node = $form['#node'];
    if(empty($node->nid)) {
                $node->block_alias = FALSE;
        }else{
                        $node->block_alias = db_result(db_query('SELECT count(*) FROM {extra_path_blocked} epb WHERE epb.nid = %d', $node->nid));
                }
       
        if(!$node->block_alias){
                $form['path']['block_alias'] = array(
                        '#type' => 'checkbox',
                        '#title' => t('Block alias'),
                        '#default_value' => $node->block_alias,
                        '#weight' => -1,
                  );
         }else{
                unset($form['path']);
         }

  }
}

function extra_path_settings_page(){
        $form = array();       
        $types = array();
        $default_types = array();
       
        foreach(node_get_types() as $key => $value){
                $types[$key] = $value->name;
        }
       
        $result = db_query('SELECT eps.type FROM {extra_path_settings} eps WHERE status = 1');
       
        while($type = db_fetch_object($result)){
                $default_types[] = $type->type;
        }

        $form['extra_path']['types'] = array(
          '#type' => 'checkboxes',
          '#title' => t('Types of content'),
          '#default_value' => $default_types,
          '#options' => $types,
        );
       
        $form['submit'] = array('#type' => 'submit', '#value' => t('Save'));
        return $form;
}

function extra_path_type_status_set($name, $status) {
  db_query("UPDATE {extra_path_settings} SET status = '%s' WHERE type = '%s'", $status, $name);
  if (!db_affected_rows()) {
    @db_query("INSERT INTO {extra_path_settings} (type, status) VALUES ('%s', '%s')", $name, $status);
  }
}

function extra_path_settings_page_submit($form, &$form_state){
        foreach($form_state['values']['types'] as $key => $value){
                extra_path_type_status_set($key, (bool)$value);
        }
}

function extra_path_type_status_get($type) {
        return db_result(db_query("SELECT eps.status FROM {extra_path_settings} eps WHERE eps.type = '%s'", $type));
}

Аватар пользователя imarat imarat 23 апреля 2012 в 7:00

может выкинуть этот модуль и сделать создание синонима рулезами при событии Добавлен новый материал

Аватар пользователя Antoniy Antoniy 1 июня 2013 в 23:59

"luciuz VII" wrote:
мне нужно, чтобы алиас НЕ обновлялся

Если в ноде стоит галочка "автоалиас", то алиас меняется, а если эта галочка не стоит, то алиас остается тем, который вписан в поле алиаса.

Модуль Pathauto persistent state как раз делает так, чтобы если галочка снята, то при node_save она не ставилась. Сейчас попробовал на Webform, там когда редактируешь компоненты (поля), а потом сразу жмешь на просмотр, раньше галочка ставилась сама, а с модулем Pathauto persistent state если она была снята, то не ставится сама.

Аватар пользователя Dekado Dekado 20 августа 2013 в 18:41

Сегодня столкнулся с такой же проблемой. Но мне надо было единоразово создать пачку страниц с определенными урлами. После node_save pathauto все равно крепил свои, хотя даже в поле синонима был правильный адрес. Как это не смешно, помогло только временное отключение pathauto, затем генерация нод, ну а затем снова его включить. Может поможет кому. Минус вродь только один, массвое обновление урлов на сайте теперь не желательно...