вторник, 28 февраля 2012 г.

Автоматическое склонение слов для drupal

Представьте, что у вас интернет-магазин с огромным количеством товаров. Вы делаете шаблонное описание ко всем товарам и робот при выводе подставляет в него наименование и категорию данного товара. И все, вроде бы, хорошо, но у вас всегда название и категория будут неизменными (как правило в именительном падеже) что не очень хорошо сказывается на читабельности данного текста, да и с точки зрения СЕО такой текст будет хуже, нежели текст в котором есть несколько словоформ одного и того же слова. Так что нам необходимо, чтобы слова в тексте заменялись на слова в нужном падеже.

Делаем это.

Собственно сама функция и вызов.

function sklon($word,$padeg) {

$url = "http://morpher.ru/WebService.asmx/GetXml?s=$word";

$hash=md5($word);

if (file_exists($hash.'.xml')) {$tmp=file($hash.'.xml'); $rod=$tmp[0]; $dat=$tmp[1]; $vin=$tmp[2]; $tvor=$tmp[3]; $predl=$tmp[4];} else {

$xml = simplexml_load_file($url);
$im = $word;
$rod = trim($xml->Р);
$dat = trim($xml->Д);
$vin = trim($xml->В);
$tvor = trim($xml->Т);
$predl = trim($xml->П);
$k=fopen($hash.'.xml',"w");
fwrite($k,$rod."\n".$dat."\n".$vin."\n".$tvor."\n".$predl."\n");
fclose($k);

}

if ($padeg == 'rod') {return $rod;} elseif ($padeg == 'dat') {return $dat;} elseif ($padeg == 'vin') {return $vin;} elseif ($padeg == 'tvor') {return $tvor;} elseif ($padeg == 'predl') {return $predl;} else {return FALSE;}
}

$text = 'sklon(бурый медведь,rod) часто видят в лесу, так часто, что даже забывают о sklon(маленький еж,predl)';

$sklonoutarr = array();
$sklonpattern = '/sklon\((.*?),(.*?)\)/';
preg_match_all($sklonpattern, $text, $sklonarray);

for ($i=0; $i<(count($sklonarray[0])); $i++) {
$text=str_replace($sklonarray[0][$i],sklon($sklonarray[1][$i], $sklonarray[2][$i]),$text);
}
echo $text;


Саму функцию нужно вставить в template.php, а вызов делаем через theme_preprocess_node:

if ($vars['page']) {

$sklonoutarr = array();
$sklonpattern = '/sklon\((.*?),(.*?)\)/';
preg_match_all($sklonpattern, $vars['content'], $sklonarray);

for ($i=0; $i $vars['content']=str_replace($sklonarray[0][$i],sklon($sklonarray[1][$i], $sklonarray[2][$i]),$vars['content']);
}

Вызов такой sklon(слово в именительном падеже, падеж)

Обращаю внимание, что необходимо создать папку для размещения кэша, потому что она сама не создается.

пятница, 24 февраля 2012 г.

Каталог на Views и хлебные крошки. (Drupal Views Breadcrumb)

Реальные продвинутые пацаны делают каталоги на drupal с помощью модуля Views. Это удобно, обеспечивает хорошую гибкость в настройках, пользовательские фильтры и прочие разные вкусности.
С точки зрения банальной эрудиции логики, а также в целях улучшения СЕОшности нашего сайта хорошо будет, если на каждой странице каталога будут присутствовать хлебные крошки, ведущие на верхние уровни каталога, вплоть до главной страницы сайта.

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

Однако, есть решение. Данный снипет, вставленный в заголовок нашей вьюхи, генерирует простые хлебные крошки для любого термина таксономии.
$breadcrumb = array();
$breadcrumb[] = l(t('Home'), "");
$breadcrumb[] = l('Запчасти', "zapchasti");
$term = arg(2);
$term2 = taxonomy_get_parents_all($term);
$term2 = array_reverse($term2);
foreach ($term2 as $parent) {
$breadcrumb[] = l($parent->name, 'taxonomy/term/'.$parent->tid);
}
unset($breadcrumb[count($breadcrumb)-1]);
drupal_set_breadcrumb($breadcrumb);
Последный unset можно убрать, тогда в хлебных крошках будет ссылка на саму страницу, на которой находится пользователь. Но по логике лучше, чтобы последней страницей в хлебных крошках была бы родительская страница.

Название Запчасти и ссылка zapchasti - это, соответственно ссылка на корень каталога, в котором показываются все родительские термины каталога. Вы можете вообще убрать эту строчку, а можете изменить путь и название на нужный вам словарь.

четверг, 23 февраля 2012 г.

Импорт значения Stock и Treshold. Ubercart Stock Importing

Дополнение для Node Import Stock And Attributes import не совсем корректно отрабатывает, когда у товара нет атрибутов. В этом случае, не создается таблица uc_product_stock и не заполняются поля Active, Stock и Treshold.
Что же делать?

Для этого нужно залезть в файл uc_stock.inc,
найти строчку:
if(module_exists('uc_attribute') && uc_attribute_has($node_type))
$data['sku'] = $values['sub_sku'];
и заменить её на
$data['sku'] = $values['model'];
if(module_exists('uc_attribute') && uc_attribute_has($node_type))
$data['sku'] = $values['sub_sku'];

После этого все замечательно работает. УРА!

Ubercart Активация опции Stock для всех товаров. Bulk Set Stock to Active

В Ubercart, к сожалению, не предусмотрено возможность включить модуль Stock разом для всех продуктов. Посредством дополнительных модулей, как, например, Ubercart Power Tools можно установить умолчательные значения для новых продуктов, но что делать, если у вас в магазине уже загружено несколько тысяч товаров? Конечно, можно открывать редактирование товара и отмечать ненавистную галку Stock Active. Но проще и быстрее выполнить следующий запрос SQL и обрести вселенское счастье за несколько секунд.

INSERT INTO uc_product_stock (sku, nid) SELECT uc_products.model, uc_products.nid FROM uc_products WHERE 1;
UPDATE uc_product_stock SET active=1;

Первый запрос копирует все продукты в таблицу модуля Stock, а второй выставляет для всех продуктов значение включено.

Если кто знает, как это можно сделать лучше, то, пожалуйста, сообщите мне.

вторник, 14 февраля 2012 г.

Грамотное добавление изображений на сайт.

Как известно, в Drupal для работы с изображениями используется модуль ImageCache.
Для того, чтобы улучшить СЕОшность нашего сайта, а также добавить пищи для всяких Гугл и Яндекс картинок, хорошо, если у картинок будут имена, соответствующие имени ноды, которой они принадлежат, а также прописанные атрибуты ALT и Title.

Это отлично решается связкой модулей
FileField Path
ImageField Tokens

Намного приятнее видеть файл вида: /testovye-produkty/testovyi-produkt-2.jpg, чем что-нить вроде x3452358sagfsf_31.jpg
Это и поисковикам читать приятнее.

Обратите внимание, что если для FileField Path есть ретроактив (возможность обновить пути файлов, загруженных до установки модуля), то для ImageField Tokens такого к сожалению нет. Те файлы, которые загружены ранее будут иметь пустые alt и title.

Есть всякие хитрые извраты, вроде массового апдейта базы данных, но об этом я напишу позднее.

Еще один момент - эти модули работают не со всеми другими модулями.
К сожалению, FileField Path не работает с Taxonomy Image (еще бы с чего ему работать, он же не CCK FileField)

Общей вывод по друпалу: Сначала устанавливаете и настраиваете все, что нужно, а потом заливаете контент. Это позволит избавить вас от проблем.