Jump to content

Añadir nuevo campo en AdminCategoriesController mediante modulo


23r9i0

Recommended Posts

Estoy haciendo un modulo y tenia la intencion de añadir un nuevo campo tipo switch en la pagina de categorias (AdminCategoriesController) pero no lo coge.

la ruta es mymodule/override/controllers/admin/AdminCategoriesController.php

y el contenido es este:

<?php
class AdminCategoriesController extends AdminCategoriesControllerCore
{
	public function renderForm()
	{
		$this->initToolbar();
		$obj = $this->loadObject(true);
		$id_shop = Context::getContext()->shop->id;
		$selected_categories = array((isset($obj->id_parent) && $obj->isParentCategoryAvailable($id_shop))? (int)$obj->id_parent : (int)Tools::getValue('id_parent', Category::getRootCategory()->id));
		$unidentified = new Group(Configuration::get('PS_UNIDENTIFIED_GROUP'));
		$guest = new Group(Configuration::get('PS_GUEST_GROUP'));
		$default = new Group(Configuration::get('PS_CUSTOMER_GROUP'));

		$unidentified_group_information = sprintf($this->l('%s - All people without a valid customer account.'), '<b>'.$unidentified->name[$this->context->language->id].'</b>');
		$guest_group_information = sprintf($this->l('%s - Customer who placed an order with the guest checkout.'), '<b>'.$guest->name[$this->context->language->id].'</b>');
		$default_group_information = sprintf($this->l('%s - All people who have created an account on this site.'), '<b>'.$default->name[$this->context->language->id].'</b>');

		if (!($obj = $this->loadObject(true)))
			return;

		$image = _PS_CAT_IMG_DIR_.$obj->id.'.jpg';
		$image_url = ImageManager::thumbnail($image, $this->table.'_'.(int)$obj->id.'.'.$this->imageType, 350,
			$this->imageType, true, true);
		$image_size = file_exists($image) ? filesize($image) / 1000 : false;

		$this->fields_form = array(
			'tinymce' => true,
			'legend' => array(
				'title' => $this->l('Category'),
				'icon' => 'icon-tags'
			),
			'input' => array(
				array(
					'type' => 'text',
					'label' => $this->l('Name'),
					'name' => 'name',
					'lang' => true,
					'required' => true,
					'class' => 'copy2friendlyUrl',
					'hint' => $this->l('Invalid characters:').' <>;=#{}',
				),
				array(
					'type' => 'switch',
					'label' => $this->l('Displayed'),
					'name' => 'active',
					'required' => false,
					'is_bool' => true,
					'values' => array(
						array(
							'id' => 'active_on',
							'value' => 1,
							'label' => $this->l('Enabled')
						),
						array(
							'id' => 'active_off',
							'value' => 0,
							'label' => $this->l('Disabled')
						)
					)
				),
				array(
					'type' => 'switch',
					'label' => $this->l('myModule'),
					'name' => 'active',
					'required' => false,
					'is_bool' => true,
					'values' => array(
						array(
							'id' => 'active_on',
							'value' => 1,
							'label' => $this->l('Enabled')
						),
						array(
							'id' => 'active_off',
							'value' => 0,
							'label' => $this->l('Disabled')
						)
					)
				),
				array(
					'type'  => 'categories',
					'label' => $this->l('Parent category'),
					'name'  => 'id_parent',
					'tree'  => array(
						'id'                  => 'categories-tree',
						'selected_categories' => $selected_categories,
						'disabled_categories' => !Tools::isSubmit('add'.$this->table) ? array($this->_category->id) : null
					)
				),
				array(
					'type' => 'textarea',
					'label' => $this->l('Description'),
					'name' => 'description',
					'autoload_rte' => true,
					'lang' => true,
					'hint' => $this->l('Invalid characters:').' <>;=#{}'
				),
				array(
					'type' => 'file',
					'label' => $this->l('Image'),
					'name' => 'image',
					'display_image' => true,
					'image' => $image_url ? $image_url : false,
					'size' => $image_size,
					'delete_url' => self::$currentIndex.'&'.$this->identifier.'='.$this->_category->id.'&token='.$this->token.'&deleteImage=1',
					'hint' => $this->l('Upload a category logo from your computer.'),
				),
				array(
					'type' => 'text',
					'label' => $this->l('Meta title'),
					'name' => 'meta_title',
					'lang' => true,
					'hint' => $this->l('Forbidden characters:').' <>;=#{}'
				),
				array(
					'type' => 'text',
					'label' => $this->l('Meta description'),
					'name' => 'meta_description',
					'lang' => true,
					'hint' => $this->l('Forbidden characters:').' <>;=#{}'
				),
				array(
					'type' => 'tags',
					'label' => $this->l('Meta keywords'),
					'name' => 'meta_keywords',
					'lang' => true,
					'hint' => $this->l('To add "tags," click in the field, write something, and then press "Enter."').' '.$this->l('Forbidden characters:').' <>;=#{}'
				),
				array(
					'type' => 'text',
					'label' => $this->l('Friendly URL'),
					'name' => 'link_rewrite',
					'lang' => true,
					'required' => true,
					'hint' => $this->l('Only letters, numbers, underscore (_) and the minus (-) character are allowed.')
				),
				array(
					'type' => 'group',
					'label' => $this->l('Group access'),
					'name' => 'groupBox',
					'values' => Group::getGroups(Context::getContext()->language->id),
					'info_introduction' => $this->l('You now have three default customer groups.'),
					'unidentified' => $unidentified_group_information,
					'guest' => $guest_group_information,
					'customer' => $default_group_information,
					'hint' => $this->l('Mark all of the customer groups you;d like to have access to this category.')
				)
			),
			'submit' => array(
				'title' => $this->l('Save'),
				'name' => 'submitAdd'.$this->table.'AndBackToParent'
			)
		);

		$this->tpl_form_vars['shared_category'] = Validate::isLoadedObject($obj) && $obj->hasMultishopEntries(); 
		$this->tpl_form_vars['PS_ALLOW_ACCENTED_CHARS_URL'] = (int)Configuration::get('PS_ALLOW_ACCENTED_CHARS_URL');
		$this->tpl_form_vars['displayBackOfficeCategory'] = Hook::exec('displayBackOfficeCategory');
		
		// Display this field only if multistore option is enabled
		if (Configuration::get('PS_MULTISHOP_FEATURE_ACTIVE') && Tools::isSubmit('add'.$this->table.'root'))
		{
			$this->fields_form['input'][] = array(
				'type' => 'switch',
				'label' => $this->l('Root Category'),
				'name' => 'is_root_category',
				'required' => false,
				'is_bool' => true,
				'values' => array(
					array(
						'id' => 'is_root_on',
						'value' => 1,
						'label' => $this->l('Yes')
					),
					array(
						'id' => 'is_root_off',
						'value' => 0,
						'label' => $this->l('No')
					)
				)
			);
			unset($this->fields_form['input'][2],$this->fields_form['input'][3]);
		}
		// Display this field only if multistore option is enabled AND there are several stores configured
		if (Shop::isFeatureActive())
			$this->fields_form['input'][] = array(
				'type' => 'shop',
				'label' => $this->l('Shop association'),
				'name' => 'checkBoxShopAsso',
			);

		// remove category tree and radio button "is_root_category" if this category has the root category as parent category to avoid any conflict
		if ($this->_category->id_parent == Category::getTopCategory()->id && Tools::isSubmit('updatecategory'))
			foreach ($this->fields_form['input'] as $k => $input)
				if (in_array($input['name'], array('id_parent', 'is_root_category')))
					unset($this->fields_form['input'][$k]);

		if (!($obj = $this->loadObject(true)))
			return;

		$image = ImageManager::thumbnail(_PS_CAT_IMG_DIR_.'/'.$obj->id.'.jpg', $this->table.'_'.(int)$obj->id.'.'.$this->imageType, 350, $this->imageType, true);

		$this->fields_value = array(
			'image' => $image ? $image : false,
			'size' => $image ? filesize(_PS_CAT_IMG_DIR_.'/'.$obj->id.'.jpg') / 1000 : false
		);

		// Added values of object Group
		$category_groups_ids = $obj->getGroups();

		$groups = Group::getGroups($this->context->language->id);
		// if empty $carrier_groups_ids : object creation : we set the default groups
		if (empty($category_groups_ids))
		{
			$preselected = array(Configuration::get('PS_UNIDENTIFIED_GROUP'), Configuration::get('PS_GUEST_GROUP'), Configuration::get('PS_CUSTOMER_GROUP'));
			$category_groups_ids = array_merge($category_groups_ids, $preselected);
		}
		foreach ($groups as $group)
			$this->fields_value['groupBox_'.$group['id_group']] = Tools::getValue('groupBox_'.$group['id_group'], (in_array($group['id_group'], $category_groups_ids)));

		$this->fields_value['is_root_category'] = (bool)Tools::isSubmit('add'.$this->table.'root');

		return AdminController::renderForm();
	}
}

Comento que hago un return a AdminController ya que todo el codigo de renderForm original esta en mi nuevo renderForm, tambien tengo desactivado el cache, ccc, forzar compilacion, y siempre elimino el file class_index.php

Pero nada, que hago mal?

Link to comment
Share on other sites

Supongo que lo más normal es que no te esté pasando por ese método, pero me llama la atención que si estás intentando modificar una pantalla desactives el forzar compilación precisamente ahora cuando debería estar activo.

 

No se qué versión usas de prestashop, se que ha cambiado bastante dependiendo de las versiones, pero nunca había visto que borren el class_index.php. Como digo, no se cual será tu caso, hay versiones que no hace falta tocarlo, otros que vienen todos los override y en otra que hay que ponerlo a mano...pero yo lo dejaría, no cuesta nada poner la clase que sobreescribimos. Nunca he probado a borrarla, pero quizás ahí esté tu problema. 

Link to comment
Share on other sites

hola jesa,

forzar compilacion lo tengo activado, fue un error al escribir el post, sobre lo de borrar el file class_index.php no me acuerdo donde lo lei se decia que se eliminase.

Tengo la version 1.6.0.6 y por lo que dice la documentacion oficial la estructura es la correcta pero no se porque no lo coge, tambien comento que no tengo ningun archivo en root/override/etc... que interfiera en el modulo y estan activados los modulos por defecto ya que es una instalacion local con lo que tengo el prestashop por defecto (por decirlo de alguna manera).

En google si que he encontrado info para añadir nuevos fields, tabs en products pero en esta seccion no he encontrado nada.

Yo vengo como programador de wp y comparando la documentacion con ps es casi nula igual que los comentarios en los archivos del core... bueno esto es solo una observacion.

 

Saludos

Link to comment
Share on other sites

Bueno, yo a día de hoy no he desarrollado todavía una tienda en la versión 1.6 osea que puede que esté equivocado y halla cambiado con respecto a la 1.5

 

Acabo de releer tu post y creo que se cual es tu problema. Cuando quieres sobreescribir una clase lo tienes que hacer en la carpeta override que está en el raiz de la instalación. Supongo que tú has leído la documentación y te indica que crees dentro de tu módulo la carpeta override para guardar las clases que sobreescribirás, pero con eso no haces nada, es solo un tema organizativo para que al ver tú módulo cualquiera sepamos lo que hay. 

Después tú tienes que copiar esa clase a su localización override/clases u override/controller en la instalación del módulo y eliminarla al desinstalar. 

 

Prueba esto que seguro que te funciona.

Link to comment
Share on other sites

pues no tiene sentido...

Pongamos el caso que X modulo tiene un override y otro modulo tambien tiene, y casualmente tu has especificado un override (the developer).

Y todos con la misma class, tu y yo (y otros) fusionariamos el override pero hay personas que no tienen el conocimiento para saberlo, o simplemente no se dedican ha eso, llamemoslos clientes.

Que pasa?

 

 

Un cliente compra un o varios modulo y si tienen su pagina de conf, lo configura que normalmente es rellenar input,textarea,radio, etc.. pero no lo veo logico que tenga que meter mano a la carpeta del override. Siempre hablando de clientes.

Tambien podria hacer mi controller y añadirlo como otro menu en el admin pero lo veo absurdo tener que hacerlo asi, es mas logico que al crear una category el cliente decida si activar esa opcion o no.

 

Bueno, por lo visto tendre que estudiar otro via para hacerlo.

Saludos

Edited by 23r9i0 (see edit history)
Link to comment
Share on other sites

Bueno, creo que tu punto de vista es coherente desde el punto de vista de alguien que no sabe programación. La cuestión es que nadie ha dicho que prestashop esté pensado para que cualquier personas sin conocimientos de programación e informática pueda montar su tienda. Nadie se plantea que los coches se arreglen apretando un botón para no tenerlo que llevar a un mecánico...para eso están los profesionales y en el caso de la informática aunque parezca mentira pues también los hay.

 

Centrándonos ya en la programación, el planteamiento de prestashop es el correcto. Lo que tú planteas primero sería un % seguramente muy bajo de todas las tiendas que hay, las cuales tendrían este tipo de problema y por otro lado la calidad del código dejaría mucho que desear. Imagínate si cada vez que se ejecuta un método de un controller o una clase tenemos que estar comprobando todos los módulos por si hay alguno que contenga el override de estos métodos, o decidir cual se ejecuta primero...no se esto que se me ocurra así de repente, pero seguro que hay muchos más problemas y más serios. 

Link to comment
Share on other sites

Yo no he dicho que no sea programador.

Pero considero que se tienen que pensar en todas las posibilidades y mas cuando partimos de la base que se usa el override para personalizar el ps.

 

... La cuestión es que nadie ha dicho que prestashop esté pensado para que cualquier personas sin conocimientos de programación e informática pueda montar su tienda. Nadie se plantea que los coches se arreglen apretando un botón para no tenerlo que llevar a un mecánico...para eso están los profesionales y en el caso de la informática aunque parezca mentira pues también los hay...

 

Ni tampoco que una persona sin conocimientos pueda montar una tienda, y por cierto nadie es mecanico pero se sabe cambiar el aceite, filtro, ruedas... Lo que quiero decir es que no tienes que ser profesional para hacer lo basico, instalar modulos, o cambiar el bg del theme.

 

No se si has trabajado con wp pero te da la opcion mediante functions de personalizar ciertos aspectos. Pero no quiero compararlo ya que el ps es mvc y wp tiene classes pero basicamente usa functions, actions, filters. Estos dos ultimos se puede modificar el resultado de la class. Con lo cual es mas limpio modificar algun aspecto del admin.

 

 

...

Centrándonos ya en la programación, el planteamiento de prestashop es el correcto. Lo que tú planteas primero sería un % seguramente muy bajo de todas las tiendas que hay, las cuales tendrían este tipo de problema y por otro lado la calidad del código dejaría mucho que desear. Imagínate si cada vez que se ejecuta un método de un controller o una clase tenemos que estar comprobando todos los módulos por si hay alguno que contenga el override de estos métodos, o decidir cual se ejecuta primero...no se esto que se me ocurra así de repente, pero seguro que hay muchos más problemas y más serios. 

 

No es cuestion de porcentaje es cuestion de calidad de un producto.

Ejemplo:

Te piden que hagas un alguna modificacion para el admin o el frontend y haces el trabajo, despues añaden un modulo con algun override de classes y que sobreescribe un metodo que tenias tu calladito como profesional y la tienda se va al garete, y el cliente te llama y dice perdona pero que has echo que la tienda no funciona. Es una hipotesis como profesional le contestas que lo ha echo usted, y si quiere me paga si se lo arreglo, para parchearle el ps.

Resultado:

cliente insatisfecho y no te recomendara.

 

Yo te he puesto arriba el ejemplo de los modulos, porque es lo que me ronda por la cabeza, y lo que podria pasar.

La calidad del codigo no voy a opinar...(ps no es perfecto).

 

Yo solo comento que el ps desde mi punto de vista no esta abierto ha modificaciones externas...

Y da igual si eres profesional o no, pero el exito del prestashop se radica en que es gratuito que es lo que ha atraido al personal a parte de que magento es peor.

 

Pero es tarde y me estoy llendo por las ramas.

Te agradezco que me contestes y des tu opinion, pero una pregunta cuanto tiempo empleas en leer/buscar el metodo por falta de documentacion? ya sea online o en los archivos, y otra que si quieres la contestas, se lo cobras al cliente? Yo no

 

Saludos

Link to comment
Share on other sites

 

 

Yo no he dicho que no sea programador.

 

Yo tampoco lo he dicho...simplemente digo que nadie ha dicho que Prestashop esté pensado para que cualquier persona sin conocimientos de programación monte una tienda. Por alguno de tus comentarios entiendo que tienes conocimientos de programación, pero no era para que te sintieras aludido. 

 

 

 

 y por cierto nadie es mecanico pero se sabe cambiar el aceite, filtro, ruedas... 

 

Hay muchas cosas básicas que puedes hacer con prestashop. Quizás el problema que tú planteas no es de prestashop, sino del desarrollador del módulo, theme, etc. Si tú compras un theme y el desarrollador decide hacerlo para cualquier color o un configurador de lo que sea, es algo personal del desarrollador, pero ahí poco puede hacer prestashop. Lo mismo pasa con los módulos.

 

 

Te piden que hagas un alguna modificacion para el admin o el frontend y haces el trabajo, despues añaden un modulo con algun override de classes y que sobreescribe un metodo que tenias tu calladito como profesional y la tienda se va al garete, y el cliente te llama y dice perdona pero que has echo que la tienda no funciona. Es una hipotesis como profesional le contestas que lo ha echo usted, y si quiere me paga si se lo arreglo, para parchearle el ps.

 

Yo en esto te puedo contar desde mi experiencia, mucha o poca....y es que nunca me ha pasado. Partiendo de la base que vayas con la verdad por delante y no ocultando información. Yo he realizado modificaciones y cuando no hay más remedio que tocar el core se le avisa al cliente para que sepa que cuidado con lo que toca. Si tú llevas tu coche al taller(o cualquier otro negocio) y después metes tú mano, vete a reclamarle al del taller, que ya verás donde te manda. 

 

 

Yo solo comento que el ps desde mi punto de vista no esta abierto ha modificaciones externas...

Y da igual si eres profesional o no, pero el exito del prestashop se radica en que es gratuito que es lo que ha atraido al personal a parte de que magento es peor.

 

Yo en esto no estoy muy de acuerdo, el problema muchas veces es que te encuentras con cualquier cosa. Básicamente porque nadie se lee la documentación(que tiene sus deficiencias como todo) y tiramos por la calle de en medio. Si cada uno programamos como queremos pues después llegan los problemas. 

 

A tus preguntas, por supuesto que no tengo problema en contestar. Lo único que no me queda claro a qué te refieres con bucar el método, pero intentaré contestarte. 

 

Si te refieres a un método en concreto cuando te piden un cambio, no creo que sea el mayor de los problemas para alguien que sabe programar encontrar el flujo del programa. Nunca me ha llevado un tiempo significativo como para valorarlo. 

Si te refieres a tu duda con los override de los módulos. Tú mismo me estás dando la razón, si cada modulo tuviera su override imagínate el rato que te llevaría ir módulo por módulo mirando a ver si hace algo. En cambio si todo está en su clase/controller dentro de override con abrir un fichero lo ves. Antes de instalar un módulo te lees la documentación(si la hay) y sino te miras qué hace al instalar y listo. Espero haberte aclarado la primera pregunta.

 

Y la segunda...pues como ves, ni siquiera es algo que me he planteado porque no creo que nadie presupuestos por minutos que es lo que me lleva hacer todo esto que dices. 

 

Para terminar este toston...me agrada esta conversación y espero que a alguien le sirva. Siempre está bien en intercambiar opiniones para aprender cosas nuevas.

 

Un saludo

Link to comment
Share on other sites

Opino igual que tu en intercambiar opiniones, tambien reconozco que a veces soy muy cuadrado cuando pienso que algo se podia plantear de una manera diferente a la que esta ... (me refiero al uso del override) pero como bien comentas un cliente no deberia tocar el core (sino tiene conocimientos) para hacer funcionar la tienda asi que el modulo que estoy haciendo lo hare con el override y le comentare al cliente el asunto por encima para que no le pase nada si en algun futuro instala un modulo que necesite usar el override.

Saludos jesa.... buena semana.

Link to comment
Share on other sites

  • nadie locked this topic
Guest
This topic is now closed to further replies.
×
×
  • Create New...