Форум SAPE.RU

Форум SAPE.RU (http://forum.sape.ru/index.php)
-   Установка кода на различные движки (http://forum.sape.ru/forumdisplay.php?f=26)
-   -   Правильный Контекстный код на Joomla 1.7 (http://forum.sape.ru/showthread.php?t=86576)

Giacomo 10.12.2012 18:49

Правильный Контекстный код на Joomla 1.7
 
На днях я впервые добавил свой сайт в эту систему, и, как и многие, столкнулся с тем, что код на сайте либо не устанавливается, либо сайт не лезет в сапу. Сколько за эти дни я перечитал обсуждений (и тут, и на серче) уже не упомнишь. Скачивал разные плагины, пробовал всякие танцы с бубном (вроде удаления той самой папки с неперивариваемым именем, и т.д.), вот только всё без толку.
Как оказалось, инструкция по установке кода на странице добавления новой площадки - некорректно составлена. То есть, у кого-то она будет работать, а у кого-то нет.

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

Итак, всем уставшим бороться с саповским кодом посвящается...

Прежде чем приступить, проверьте что у вас есть Total Commander и WinRar. Хотя если вы вместо них пользуетесь чем-то другим - не беда.

Шаг 1:
со страницы добавления новой площадки скачиваем архив с длинющим именем вида d670f37280253c38a6a99b57b7e3efb9__php.zip
Распаковываем его в папку с таким же именем (то есть, если у вас есть WinRar, то жмём на файле правой кнопкой и выбираем "Извлечь в d670f37280253c38a6a99b57b7e3efb9__php/").

Шаг2:
Заходим в эту распакованную папку, там есть папка вида d670f37280253c38a6a99b57b7e3efb9 и ещё рядом с ней файл с таким же именем d670f37280253c38a6a99b57b7e3efb9.php
Так вот, этот файл нам НЕ нужен (зачем он там вообще присутствует??).
Нам нужна только папка d670f37280253c38a6a99b57b7e3efb9 .
Соединяемся по FTP со своим сайтом и копируем эту папку d670f37280253c38a6a99b57b7e3efb9 в корень своего сайта. Убедитесь в начале, что вы копируете именно в корень (то есть, там присутствуют папки administrator, cache, cli, components, files, images, includes, libraries,...).

Шаг3:
Скопировав эту папку на сервер, поставьте в Total Commander'e на неё курсор и в верхнем меню:
Файлы -> Изменить аттрибуты -> выставьте значение 777 и нажмите ОК.

Шаг4:
Не отключаясь от сервера идите сюда:
templates/ИМЯ_ВАШЕГО_ШАБЛОНА_Joomla
и найдите там файл index.php
скопируйте его к себе на компьютер.
Внимание!! Сразу же создайте на компьютере папку "Изначальный Шаблон" и скопируйте туда главный файл вашего шаблона. Если вы что-то испортите, то сможете потом восстановить исходный файл, скопировав его поверх изменённого.
откройте файл и посмотрите есть ли там такое:
<head>
тут всякий код
</head>
Если есть, то вы нашли то, что искали - это главный файл вашего шаблона. Если там такого нет (как у меня), то вам надо порыться в папке templates/ИМЯ_ВАШЕГО_ШАБЛОНА_Joomla и во внутренних папках.
Лично у меня этот файл был здесь:
templates/ИМЯ_ШАБЛОНА_Joomla/layouts/template.php
Обратите внимание, что он не обязательно должен называться index.php!

Шаг5:
Как только вы нашли главный файл вашего шаблона и вытащили его копию с сервера, откройте его и найдите секцию кода между тегами head:
<head>
тут всякий код
</head>
Теперь перед самым </head> вставьте:

<?php
if (!defined('_SAPE_USER')){
define('_SAPE_USER', 'ХЕШ-КОД');
}
require_once('АДРЕС_САЙТА_НА_СЕРВЕРЕ'.'/'._SAPE_USER.'/sape.php');

$o['charset'] = 'UTF-8';
$o['force_show_code'] = true;
$o['request_uri'] = $_SERVER['REDIRECT_URL'];

$sape_context = new SAPE_context();
?>

ХЕШ-КОД - это имя папки, которую вы копировали на сервер в Шаге 2.

АДРЕС_САЙТА_НА_СЕРВЕРЕ - это и был главный трабл кода, который предоставляет Sape. Изначально эта строка выглядит так:
require_once($_SERVER['DOCUMENT_ROOT'].'/'._SAPE_USER.'/sape.php');

Эта строка составляет адрес той самой папки (точнее, файла sape.php внутри неё), которую вы скопировали ранее.
Она составляет адрес из четырёх частей:
ПУТЬ_К_ВАШЕМУ_САЙТУ_НА_СЕРВЕРЕ./.ИМЯ_ХЕШ_ПАПКИ./sape.php

$_SERVER['DOCUMENT_ROOT'].'/'._SAPE_USER.'/sape.php'

Строки склеиваются вместе с помощью точек (.) В результате образуется строка-адрес к файлу sape.php с точки зрения самого сервера.
Надеюсь, пока не слишком сложно? :)

$_SERVER['DOCUMENT_ROOT'] - эта абракадабра спрашивает у сервера путь к вашему сайту и сервер отвечает что-то типа:

"Ваш сайт находится на сервере в папке /var/www/html"

Так вот, прикол в том, что это может быть неправильный адрес!
Как и было в моём случае. Я не спец, но думаю, что сервер просто неправильно настроен, в результате чего саповские коды начинают искать сайт по неправильному адресу. И, вероятно, такое бывает на многих серверах.

Это как раз и приводит к знаменитой ошибке:

Цитата:

Fatal error: require_once(): Failed opening required '/var/www/html/d670f37280253c38a6a99b57b7e3efb9/sape.php'
Реально же адрес моего сайта выглядит вот так:

/home/vhosts/www.mysite.ru

То есть, никаких /var/www/html , которые получает $_SERVER['DOCUMENT_ROOT'] там нет.

Вместо того, чтобы полагаться на автоматику, нужно вписать красную часть адреса вручную, не забыв заключить её в одинарные кавычки:

require_once('/home/vhosts/www.mysite.ru'.'/'._SAPE_USER.'/sape.php');

Где взять адрес сайта на сервере?

Идём в админку Джумлы 1.7, в верхнем меню:
Сайт - Общие настройки - вкладка Сервер
смотрите самое первое поле "Путь к каталогу временных файлов"
копируйте из него всё кроме /tmp части.
Вставьте аккуратно это всё вместо $_SERVER['DOCUMENT_ROOT'] и обрамите одинарными кавычками.

Теперь ваш код должен выглядеть примерно так:

<?php
if (!defined('_SAPE_USER')){
define('_SAPE_USER', 'd670f37280253c38a6a99b57b7e3efb9');
}
require_once('/home/vhosts/www.mysite.ru'.'/'._SAPE_USER.'/sape.php');

$o['charset'] = 'UTF-8';
$o['force_show_code'] = true;
$o['request_uri'] = $_SERVER['REDIRECT_URL'];


$sape_context = new SAPE_context();
?>

Уфффф!
Кстати, по поводу части кода, котый я выделил красным - он не присутствует в оригинальном коде Sape, но без него Sape не находит код
Цитата:

Код на сайте не установлен
Эти три строчки фиксят ненахождение кода когда на сайте включён SEF(он же ЧПУ), фиксят кодировку ссылок (иначе вместо ссылок появятся кракозябры), и ещё что-то, уже не помню.

Шаг6:

Теперь, когда мы вставили код в head, плавно прокручивайте ваш главный файл шаблона и ищите, где происходит вывод контента. Ищите что-то вроде
$this['template']->render('content');
Ключевые слова здесь template и content
Эта строка определённо должна быть не в начале документа, и должна идти после всяких breadcrumbs и before-content'ов

У меня эта строка целиком выглядит так:

<section id="content" class="grid-block"><?php echo $this['template']->render('content'); ?></section>

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

Теперь мы должны выключить этот код, чтобы не стирать его. В принципе, можно было бы и стереть, но я предпочитаю иметь пути к отступлению в случае чего.
Добавьте в этот код символы, выделенные красным:

<!--
<section id="content" class="grid-block"><?php /* echo $this['template']->render('content'); */ ?></section>
-->

А что делать, если ваш код выглядит по-другому?
Не переживайте. Смысл в том, чтобы весь блок заключить в эти штуки:
<!-- и -->
а затем в этом блоке после каждого <? или <?php вставить /*
и перед каждым ?> или php?> вставить */

Будьте внимательны со всем этим!

Структура должна получиться такая:

<!--
тут всякий html код
<?
/*
тут php код
*/
?>
тут ещё что-нибудь может быть
-->

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

Теперь ниже, сразу после этого выключенного кода, вставьте:

<?
$text = 'КОД_ВЫВОДА_СТАТЬИ';
$text = $sape_context->replace_in_text_segment($text);
echo $text;
?>

Всё, что нам осталось сделать - это вставить КОД_ВЫВОДА_СТАТЬИ между одинарных кавычек в переменную $text.

И вот тут может возникнуть самая большая сложность для тех, кто незнаком с PHP и прочими мамбо-джамбо (как я). По правде я понятия не имею о php, всяких там javascripts/mysql, я далеко не программист, а правлю коды всегда исходя из собственной интуиции и номинального знания html на уровне детсада старшей группы.
Поэтому мне было сложно сообразить как же один код грамотно вставить в другой код. Но, выпив чашечку кофе и слегка напрягшись, я сконструировал что-то, что к моему величайшему удивлению заработало с первого раза.

Что я сделал?

те части кода, которые на html, я заключил в одинарные кавычки, а у того, что на php, я стёр открывающие и закрывающие теги, вот эти:
<? и ?>
они могут выглядеть и так:
<?php и php?>
а могут быть их комбинацией.

Ещё я стёр echo посмотрев аналогичные участки кода.
Также удалил все пробелы между частями строки.
И склеил их точками (.) - как видел в готовом коде выше.

Короче, у меня получилась такая структура:
$text = 'html-код'.php-код.'html-код закрывающий';

! Обратите внимание, что html-код в кавычках, а php-код - без кавычек.

В результате получил вот это:

$text = '<section id="content" class="grid-block">'.$this['template']->render('content').'</section>';

а всё вместе это выглядит так:

<?
$text = '<section id="content" class="grid-block">'.$this['template']->render('content').'</section>';
$text = $sape_context->replace_in_text_segment($text);
echo $text;
?>

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

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

Удачи вам! И бооольшущих заработков!

zhegloff 10.12.2012 19:00

Цитата:

Сообщение от Giacomo (Сообщение 1298240)
Так вот, этот файл нам НЕ нужен (зачем он там вообще присутствует??).

Захотите работать с биржей статей - узнаете.


Цитата:

Сообщение от Giacomo (Сообщение 1298240)
И, вероятно, такое бывает на многих серверах.

Нет, только на хостингах с рукожопыми админами. Таких меньше одного процента.


Цитата:

Сообщение от Giacomo (Сообщение 1298240)
Идём в админку Джумлы 1.7, в верхнем меню:
Сайт - Общие настройки - вкладка Сервер
смотрите самое первое поле "Путь к каталогу временных файлов"
копируйте из него всё кроме /tmp части.
Вставьте аккуратно это всё вместо $_SERVER['DOCUMENT_ROOT'] и обрамите одинарными кавычками.

Тут может быть большой эпикфейл, ибо частенько там тоже левые пути прописаны.


Цитата:

Сообщение от Giacomo (Сообщение 1298240)
$o['request_uri'] = $_SERVER['REDIRECT_URL'];

С этой строчкой может быть тоже большой эпикфейл ибо она НЕ работает намного чаще, чем встречаются сервера с кривым документ-рутом.

А так вообще пять с плюсом вам за трудолюбие :)

Giacomo 10.12.2012 21:22

Цитата:

Сообщение от zhegloff (Сообщение 1298245)

Нет, только на хостингах с рукожопыми админами. Таких меньше одного процента.

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

Цитата:

Сообщение от zhegloff (Сообщение 1298245)
Тут может быть большой эпикфейл, ибо частенько там тоже левые пути прописаны.

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

Цитата:

Сообщение от zhegloff (Сообщение 1298245)
Сообщение от Giacomo
$o['request_uri'] = $_SERVER['REDIRECT_URL'];

С этой строчкой может быть тоже большой эпикфейл ибо она НЕ работает намного чаще, чем встречаются сервера с кривым документ-рутом.

А она вообще для чего предназначается? Тоже что-то фиксит? Я где-то в интернете нашёл эти строчки и вставил, после чего всё заработало.

zhegloff 10.12.2012 22:42

Цитата:

Сообщение от Giacomo (Сообщение 1298303)
Вообще, если там путь левый, то установка плагинов не должна работать, как я понимаю, на что само собой внимание обращается.

Ну в общем-то да, хороший признак :)


Цитата:

Сообщение от Giacomo (Сообщение 1298303)
А она вообще для чего предназначается? Тоже что-то фиксит? Я где-то в интернете нашёл эти строчки и вставил, после чего всё заработало.

Для указания адреса текущей страницы коду сапы.

Giacomo 11.12.2012 10:02

Я придумал как ещё определить путь к сайту на сервере.

Способ 2 (железный):
1. Создаём текстовый документ и пишем в него:

<?
$test = abc();
echo $test;
?>

2. Сохраняем его и называем checkpath.php
3. Соединяемся по FTP со своим сайтом и копируем этот файл в корень сайта.
4. Открываем в браузере адрес http://www.ВашСайт.ru/checkpath.php
смотрим на сообщение об ошибке:
Цитата:

Fatal error: Call to undefined function abc() in /home/vhosts/www.ВашСайт.ru/checkpath.php on line 2
То что выделено жирным - и есть путь к сайту.

PS Я уже не могу поправить свой первый пост, но буду благодарен, если модератор прилепит этот способ в нужное место :)

zhegloff 11.12.2012 11:01

Есть еще более железный способ - функция phpinfo();


Часовой пояс GMT +3, время: 07:55.

Работает на vBulletin® версия 3.8.7.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot
SAPE.RU — система купли-продажи ссылок с главных и внутренних страниц сайтов.