Дополнительное поле при создании поста

Создал дополнительное поле при создании/редактировании поста — Ссылка на источник, все работает нормально, но вот проблема, ссылка отображается как простой текст. Вроде как, для отображения как ссылки, нужно что-то добавить в ActionTopic.class.php (у меня версия 0.3.1) в разделы «Парсим на предмет ХТМЛ тегов», но вот что не могу сообразить, может кто что-нибудь посоветует.

Для ясности проделал следующие операции.

1. В ActionTopic.class.php после:
$_REQUEST['topic_title']=$oTopic->getTitle();


добавил:
$_REQUEST['topic_source']=$oTopic->getSource();


после:
$oTopic->setTextSource(getRequest('topic_text'));


в 2-х местах (добавление и редактирование) добавил:
$oTopic->setSource(getRequest('topic_source'));


2. В Topic.entity.class.php перед:
public function getTags() {
        return $this->_aData['topic_tags'];
    }

добавил:
public function getSource() {
        return $this->_aData['topic_source'];
    }

и перед:
public function setTextSource($data) {
        $this->_aData['topic_text_source']=$data;
    }


добавил:
public function setSource($data) {
        $this->_aData['topic_source']=$data;
    }


3. В Topic.mapper.class.php добавил source сюда:
public function AddTopic(TopicEntity_Topic $oTopic) {
                $sql = "INSERT INTO ".DB_TABLE_TOPIC." 
                        (blog_id,
                        user_id,
                        topic_type,
                        topic_title, 
                        topic_source,                   
                        topic_tags,
                        topic_date_add,
                        topic_user_ip,
                        topic_publish,
                        topic_publish_draft,
                        topic_publish_index,
                        topic_cut_text,
                        topic_forbid_comment,
                        topic_text_hash                 
                        )
                        VALUES(?d,  ?d,	?,	?,	?,	?,  ?, ?, ?d, ?d, ?d, ?, ?, ?d, ?)
                ";                      
                if ($iId=$this->oDb->query($sql,$oTopic->getBlogId(),$oTopic->getUserId(),$oTopic->getType(),$oTopic->getTitle(),$oTopic->getSource(),$oTopic->getTags(),$oTopic->getDateAdd(),$oTopic->getUserIp(),$oTopic->getPublish(),$oTopic->getPublishDraft(),$oTopic->getPublishIndex(),$oTopic->getCutText(),$oTopic->getForbidComment(),$oTopic->getTextHash()))


и сюда:
public function UpdateTopic(TopicEntity_Topic $oTopic) {                
                $sql = "UPDATE ".DB_TABLE_TOPIC." 
                        SET 
                                blog_id= ?d,
                                topic_title= ?,
                                topic_source = ?,                         
                                topic_tags= ?,
                                topic_date_add = ?,
                                topic_date_edit = ?,
                                topic_user_ip= ?,
                                topic_publish= ?d ,
                                topic_publish_draft= ?d ,
                                topic_publish_index= ?d,
                                topic_rating= ?f,
                                topic_count_vote= ?d,
                                topic_count_read= ?d,
                                topic_count_comment= ?d, 
                                topic_cut_text = ? ,
                                topic_forbid_comment = ? ,
                                topic_text_hash = ? 
                        WHERE
                                topic_id = ?d
                ";                      
                if ($this->oDb->query($sql,$oTopic->getBlogId(),$oTopic->getTitle(),$oTopic->getSource(),$oTopic->getTags(),$oTopic->getDateAdd(),$oTopic->getDateEdit(),$oTopic->getUserIp(),$oTopic->getPublish(),$oTopic->getPublishDraft(),$oTopic->getPublishIndex(),$oTopic->getRating(),$oTopic->getCountVote(),$oTopic->getCountRead(),$oTopic->getCountComment(),$oTopic->getCutText(),$oTopic->getForbidComment(),$oTopic->getTextHash(),$oTopic->getId())) {


4. Выполнил запрос в базу:
ALTER TABLE `prefix_topic` ADD `topic_source` varchar(250) default NULL AFTER `topic_forbid_comment`


5. В шаблон topic.tpl добавил:
{if $oTopic->getSource()}
                <br />
                <br />
                <i>Источник: {$oTopic->getSource()}</i>{/if}


6. В шаблон actions/ActionTopic/add.tpl добавил:
<p><label for="topic_source">{$aLang.topic_source}:</label><br />
					<input type="text" id="topic_source" name="topic_source" value="{$_aRequest.topic_source}" class="w100p" /><br />
       				<span class="form_note">{$aLang.topic_source_notice}</span></p>


7. В файл языка russian.php добавил:
'topic_source' => 'Источник',
'topic_source_notice' => 'Укажите ссылку на сайт, с которого Вы взяли материалы для этого поста. Это поле является обязательным для постов, в которых содержатся тексты и графика, созданные не лично Вами.',

25 комментариев

avatar
Может так?
Источник: <a href="{$oTopic->getSource()}">{$oTopic->getSource()}</a>

Извиняюсь, если не так понял.
  • _et
  • 0
avatar
да это ясно, что можно так, но нужно как в тексте, если ссылка без http://, то она отображается как текст, если с http://, то как ссылка. И вроде как в предложенном варианте если без http://, то ссылка будет битая
avatar
Ну так написать, чтобы указывали ссылки с http)
avatar
уже убедился, хоть напиши заглавными — каждый будет делать так как ему нужно
avatar
люди у кого-нить на 0.4.2 работает? что-то просто не получается у меня.
avatar
тьфу, Смотрю в книгу, вижу фигу называется.
кто нить подскажите как сделать на 0.4.2, очень хочу кое-что проверить, если получится позже сюда выложу
avatar
Попробуй по аналогии сделать. В принципе его я делал под 0.3.1, а под 0.4.2 врятли будет работать
avatar
Вот что выдает
Notice: Undefined index: topic_Source in S:\home\test1.ru\www\classes\modules\topic\entity\Topic.entity.class.php on line 58
[ убрать подсказку | никогда больше не показывать ]

Это предупреждение, вероятнее всего, возникает вследствие высокого уровня контроля ошибок в PHP, по умолчанию установленного в Денвере (E_ALL). Такой режим вывода ошибок является рекомендуемым и сильно помогает при отладке скриптов. Однако множество готовых скриптов требуют более низкого уровня ошибок.

Вы можете установить более слабый контроль ошибок одним из следующих способов:

    * Впишите в скрипты строчку:

      Error_Reporting(E_ALL & ~E_NOTICE);

      Этот способ особенно удобен, если в скрипте есть один файл (конфигурационный), который подключается всеми остальными.
    * Рекомендуемый способ. Создайте в директории со скриптом файл .htaccess следующего содержания:

      php_value error_reporting 7

    * Исправьте в /usr/local/php/php.ini значение error_reporting на E_ALL & ~E_NOTICE. Этот способ не является рекомендуемым и может привести к серьезным неудобствам при отладке!

[Денвер: показать возможную причину ошибки]SQL Error: Column count doesn't match value count at row 1 at S:\home\test1.ru\www\classes\modules\topic\mapper\Topic.mapper.class.php line 40
Array ( [code] => 1136 [message] => Column count doesn't match value count at row 1 [query] => INSERT INTO prefix_topic (blog_id, user_id, topic_type, topic_title, topic_source, topic_tags, topic_date_add, topic_user_ip, topic_publish, topic_publish_draft, topic_publish_index, topic_cut_text, topic_forbid_comment, topic_text_hash ) VALUES(2, 1, 'topic', 'Вечерние игры', NULL, 'Supernatural', '2010-08-11 19:55:16', 127, 1, 1, '0', NULL, '0') [context] => S:\home\test1.ru\www\classes\modules\topic\mapper\Topic.mapper.class.php line 40 ) 
avatar
тьфу, посмотрел, оказывается с большой буквы написал, теперь такая
SQL Error: Column count doesn't match value count at row 1 at S:\home\test1.ru\www\classes\modules\topic\mapper\Topic.mapper.class.php line 40
Array ( [code] => 1136 [message] => Column count doesn't match value count at row 1 [query] => INSERT INTO prefix_topic (blog_id, user_id, topic_type, topic_title, topic_source, topic_tags, topic_date_add, topic_user_ip, topic_publish, topic_publish_draft, topic_publish_index, topic_cut_text, topic_forbid_comment, topic_text_hash ) VALUES(2, 1, 'topic', 'Вечерние игры', 'kinopoisk.ru', 'Supernatural', '2010-08-11 20:01:00', 127, 1, 1, '0', NULL, '0') [context] => S:\home\test1.ru\www\classes\modules\topic\mapper\Topic.mapper.class.php line 40 ) 
avatar
ALTER TABLE `prefix_topic` ADD `topic_source` varchar(250) default NULL AFTER `topic_forbid_comment`
А куда этот запрос прописывается? Делаю дополнительное поле в профиле, но у меня не получается, постоянно ошибку выдает, подумал может что-то где-то еще не прописал
avatar
Вам знакомы слова phpmyadmin и sql?
avatar
этот запрос для бд, его нужно не прописывать, а выполнить в базу для записи этого поля
avatar
Что такое phpmyadmin и sql уже узнал:)

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

Поле сделал по аналогии с полями страна, город, т.е. добавил в БД поля с аналогичными параметрами, в mapper, entity добавил нужный код для обработки данных. Но вот не могу понять как сделать так чтобы все что написано в поле через запятую воспринималось не как один единственный интерес, а интересы разделенные через запятую являлись отдельными ссылками.

Я пытался сделать следующим образом:
В user.class.php в код вставил конструкцию типа
$aProfileIntrest=explode(',',$oIntrest->getName());
для того чтобы запятые разделяли тест на отдельные ссылки, т.е. стало выглядеть так:
/**
	 * Добавляет интересы
	 *
	 * @param ModuleUser_EntityIntrest $oIntrest
	 * @return unknown
	 */
	public function AddIntrest(ModuleUser_EntityIntrest $oIntrest) {
$aProfileIntrest=explode(',',$oIntrest->getName());		
if ($sId=$this->oMapper->AddIntrest($oIntrest)) {
			$oIntrest->setId($sId);
			//чистим зависимые кеши
			$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("intrest_new"));
			return $oIntrest;
		}
		return false;
	}

Но ничего не изменилось и вся информация в поле продолжает отображаться единой ссылкой. Подскажите я вообще в правильном направлении двигаюсь или таким образом такую задачу в принципе решить нельзя?
avatar
посмотрите как сделаны теги. ничем не отличается.
avatar
Попробовал сделать так же как и теги, но только запутался и ничего не получилось. А разве нельзя установить разрыв (или как это правильно называется) после каждой запятой, чтобы текст между запятыми записывался в разные поля Name и им присваивались свои Id?
avatar
Елси я правильно понял вашу проблему, то попробуйте так:
$source = stripos(getRequest('topic_source'), 'http://')!==0 ? 'http://'.getRequest('topic_source') : getRequest('topic_source');

$oTopic->setSource($source);
avatar
А есть ли фозможность это плагином запоковать? Для ls 4.2???
avatar
На версии 0.4.2 все что написал combat отлично работает
avatar
а под 0.51 пашет?
avatar
Никто не хочет допилить/упаковать в плагин?
avatar
напиши в личку
avatar
Подскажешь как это для 0.5.1
avatar
так же
avatar
templates/skin/new/topic_topic.tpl
А не…
templates/skin/new/topic.tpl
(вставляем как по howto)

Аналогично сделаешь изменения в файле
templates/skin/new/topic_link.tpl
А не
templates/skin/new/topic_list.tpl

Если так сделаешь, все будет работать — проверено на 0.5.1
avatar
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.